怎么向easyui grid里面插入空数据_浅谈数据结算(三)
1、
第二章:棧和隊列
通過下面的思維導圖來依次分享「棧和隊列」里面重要知識點。
2、
第一節:棧
1. 棧的定義:
棧(stack):只允許在一端進行插入或刪除操作的線性表。
棧頂(Top):線性表允許進行插入和刪除的那一端。
棧底(Bottom): 固定的,不允許進行插入和刪除的另一端。
空棧:不含任何元素的空表。
棧的操作特性:后進先出(Last In First Out, LIFO),即后進入棧的元素先出棧。
2. 棧的基本操作有:
①InitStack(&S): 初始化一個空棧S。
②StackEmpty(S): 判斷一個棧是否為空,若棧S為空返回true,否則返回false。
③Push(&S,x): 進棧,若棧S未滿,將x加入,使之成為新棧頂。
④Pop(&S,&x): 出棧,若棧S非空,彈出棧頂元素,并用x返回。
⑤GetTop(S,&x): 讀棧頂元素,若棧S非空,用x返回棧頂元素。
⑥ClearStack(&S): 銷毀棧,并釋放棧S占用的存儲空間。
3. 棧的順序存儲結構:
①順序棧的實現:利用一組地址連續的存儲單元存放自棧底到棧頂的數據元素,同時附設一個指針(top)指示當前棧頂的位置。棧的順序存儲類型的描述為:
1#define MaxSize 50 //定義棧中元素的最大個數 2typedef struct{ 3 Elemtype data[MaxSize]; //存放棧中元素 4 int top; //棧頂元素 5} SqStack;說明:
棧頂指針:S.top,初始時設置S.top = -1,
棧頂元素:S.data[S.top];
進棧操作:棧不滿時,棧頂指針先加1,再送值到棧頂元素。
出棧操作:棧非空時,先取棧頂元素值,再將棧頂指針減1。
??諚l件:S.top==-1;
棧滿條件:S.top==MaxSize-1;
棧長:S.top+1。
②順序棧的基本運算的實現:
a.棧的初始化,如下:
1void InitStack(&S){ 2 s.top = -1; //初始化棧頂指針 3}b.判斷棧是否為空,如下:
1bool StackEmpty(S){ 2 if(s.top==-1) //???3 return true; 4 else //不空 5 return false; 6}c.進棧,如下:
1bool Push(SqStack &S,ElemType x){ 2 if(S.top==MaxSize-1) //棧滿,報錯 3 return false; 4 S.data[++S.top]=x; //指針先加1,再入棧 5 return true; 6}d.出棧,如下:
1bool Pop(SqStack &S,ElemType x){ 2 if(S.top==-1) //???#xff0c;報錯 3 return false; 4 x=S.data[S.top--]; //先出棧,指針再減1 5 return true; 6}e.讀棧頂元素,如下:
1bool GetTop(SqStack S,ElemType &x){ 2 if(S.top==-1) //棧空,報錯 3 return false; 4 x=S.data[S.top]; //x記錄棧頂元素 5 return true; 6}③共享棧:利用棧底位置相對不變的特性,可以讓兩個順序棧共享一個一維數據空間,將兩個棧的棧底分別設置在共享空間的兩端,兩個棧頂向共享空間的中間延伸,如下圖:
說明:兩個棧的棧頂指針都指向棧頂元素,top0=-1時0號棧為空,top1=MaxSize時1號棧為空;僅當兩個棧頂指針相鄰(top1-top0=1)時,判斷為棧滿。當0號棧進棧時top0先加1再賦值,1號棧進棧時top1先減1再賦值,出棧時剛好相反。
4. 棧的鏈式存儲結構:采用鏈式存儲的棧稱為鏈棧,鏈棧的優點是便于多個棧共享存儲空間和提高其效率,且不存在棧滿上溢的情況。通常采用單鏈表實現,并規定所有操作都是在單鏈表的表頭進行的,一般規則鏈棧沒有頭結點。
棧的鏈式存儲類型可描述為,如下:
1typedef struct Linknode{ 2 ElemType data; //數據域 3 struct Linknode *next; //指針域 4} *LiStack; //棧類型定義3、
第二節:隊列
1. 隊列的定義:
隊列(Queue):隊列簡稱隊,也是一種操作受限的線性表,只允許在表的一端進行插入,而在表的另一端進行刪除。向隊列中插入元素稱為入隊或進隊;刪除元素稱為出隊或離隊。
隊頭(Front):允許刪除的一端,又稱為隊首。
隊尾(Rear): 允許插入的一端。
空隊列:不含任何元素的空表。
2. 隊列的基本操作有:
①InitQueue(&Q): 初始化隊列,構造一個空隊列Q。
②QueueEmpty(Q): 判斷一個隊列是否為空,若隊列Q為空返回true,否則返回false。
③EnQueue(&Q,x): 入隊,若隊列Q未滿,將x加入,使之成為新的隊尾。
④DeQueue(&Q,&x): 出隊,若隊列Q非空,刪除隊頭元素,并用x返回。
⑤GetHead(Q,&x): 讀隊頭元素,若隊頭Q非空,則將隊頭元素賦值給x.
3. 隊列的順序存儲結構:
①隊列的順序實現:是指分配一塊連續的存儲單元存放隊列中的元素,并附設兩個指針front和rear分別指示隊頭元素和隊尾元素的位置。
②隊列的順序存儲類型可描述為:
1#define MaxSize 50 //定義隊列中元素的最大個數 2typedef struct{ 3ElemType data[MaxSize]; //存放隊列元素 4int front,rear; //隊頭指針和隊尾指針 5} SqQueues;說明:
初始狀態(隊空條件):Q.front==Q.rear==0。
進隊操作:隊不滿時,先送值到隊尾元素,再將隊尾指針加1。
出隊操作:隊不空,先取隊頭元素值,再將隊頭指針加1。
4. 隊列的鏈式存儲結構:
①隊列的鏈式表示:稱為鏈隊列,它實際上是一個同時帶有隊頭指針和隊尾指針的單鏈表。
②隊列的鏈式存儲類型可描述為:
1typedef struct{ //鏈式隊列結點 2 Elemtype data; 3 struct LinkNode *next; 4}LinkNode; 5typedef struct{ //鏈式隊列 6 LinkNode *front,*rear; //隊列的隊頭和隊尾指針 7}LinkQueue;說明:當Q.front==NULL且Q.rear==NULL時,鏈式隊列為空。出隊時,首先判斷對是否為空,若不空,則取出隊頭元素,將其從鏈表中摘除,并讓Q.front指向下一個結點(若該結點為最后一個結點,則置Q.front和Q.rear都為NULL)。入隊時,建立一個新結點,將新結點插入到鏈表的尾部,并改讓Q.rear指向這個新插入的結點(若原隊列為空,則令Q.front也指向該結點)。
③鏈式隊列的基本操作:
a.初始化,如下:
1void InitQueue(LinkQueue &Q){ 2Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode)); //建立頭結點 3Q.front->next=NULL; //初始為空 4}b.判隊空,如下:
1bool IsEmpty(LinkQueue Q){ 2 if(Q.front==Q.rear) return true; 3 else return false; 4}c.入隊,如下:
1void EnQueue(LinkQueue &Q,ElemType x){ 2s=(LinkNode *)malloc(sizeof(LinkNode)); 3s->data=x; //創建新結點,插入到鏈尾 4s->next=NULL; 5Q.rear->next=s; 6Q.rear=s; 7}d.出隊,如下:
1bool DeQueue(LinkQueue &Q,Elemtype &x){2 if(Q.front==Q.rear) return false; //空隊3 p=Q.front->next;4 x=p->data;5 Q.front->next=p->next;6 if(Q.rear==p)7 Q.rear=Q.front; //若原隊列中只有一個結點,刪除后變空8 free(p);9 return true; 10}4、
第三節:棧和隊列的應用
1. 棧在括號匹配中的應用:
例如:在下面的括號序列中
括號 [ ( [ ] [ ] ) ]
括號編號1 2 3 4 5 6 7 8
①計算機接收第1個括號“[”后,期待與之匹配的第8個括號“]”出現。
②獲得了第2個括號“(”,此時第1個括號“[”暫時放在一邊,而急迫期待與之匹配的第7個括號“)”的出現。
③獲得了第3個括號“[”, 此時第2個括號“(”暫時放在一邊,而急迫期待與之匹配的第4個括號“]”的出現。第3個括號的期待得到滿足,消解之后,第2個括號的期待匹配又成為當前最急迫的任務了。
④依此類推,可見,該處理過程與棧的思想吻合。
算法的思想如下:
①初始設置一個空棧,順序讀入括號。
②若是右括號,則或者使置于棧頂的最急迫期待得以消解,或者是不合法的情況(括號序列不匹配,退出程序)。
③若是左括號,則作為一個新的更急迫的期待壓入棧中,自然使原有的在棧中的所有未消解的期待的急迫性降了一級。算法結束時,棧為空,否則括號序列不匹配。
2. 隊列在計算機系統中應用:
①解決主機與外部設備之間速度不匹配的問題 :
以主機和打印機之間速變不匹配的問題為例,主機輸出數據給打印機打印,輸出數據的速度比打印數據的速度要快得多,由于速度不匹配,若直接把輸出的數據送給打印機打印顯然是不行的。
解決的方法是:設置一個打印數據緩沖區, 主機把要打印輸出的數據依次寫入到這個緩沖區中,寫滿后就暫停輸出,轉去做其他的事情。打印機就從緩沖區中按照先進先出的原則依次取出數據并打印,打印完后再向主機發出請求。主機接到請求后再向緩沖區寫入打印數據。這樣做既保證了打印數據的確,又使主機提高了效率。故打印數據緩沖區中所存儲的數據就是一個隊列。
②解決由多用戶引起的資源競爭問題 :
CPU(即中央處理器,它包括運算器和控制器)資源的競爭為例,在個帶有多終端的計算機系統上,有多個用戶需要CPU各自運行自己的程序,它們分別通過各自的終端向最操作系統提出占用CPU的請求。操作系統通常按照每個請求在時間上的先后順序,把它們排成個隊列,每次把CPU分配給隊首請求的用戶使用。當相應的程序運行結束或用完規定的時間間隔后,則令其出隊,在把CPU分配給新的隊首請求的用戶使用。這樣既滿足了每個用戶的請求,又使CPU能夠正常運行。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的怎么向easyui grid里面插入空数据_浅谈数据结算(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qcustomplot删除一条曲线_微凉
- 下一篇: c语言 二进制输出_程序员入门C语言,需