模板
Stack 主結構
| #define ENTSIZ 1024
 typedef struct
 {
 struct Data
 {
 
 };
 struct Node* _next;
 }Node;
 
 typedef struct
 {
 Node* top;
 }Stack;
 
 Node entries[ENTSIZ], * entry = entries, * freeBuk;
 
 inline void push(register Stack* stk, register Node val)
 {
 if (freeBuk)
 {
 Node* tmp = freeBuk->_next;
 *freeBuk = val, freeBuk->_next = stk->top;
 stk->top = freeBuk;
 freeBuk = tmp;
 }
 else
 {
 *entry = val, entry->_next = stk->top;
 stk->top = entry++;
 }
 }
 
 inline Node pop(register Stack* stk)
 {
 Node* tmp = stk->top;
 stk->top = stk->top->_next;
 tmp->_next = freeBuk;
 return *(freeBuk = tmp);
 }
 
 | 
概述
本組模板為堆疊模板,在已知元素數量上限時使用此模板可以省去動態宣告記憶體的時間,本模板可同時宣告並使用複數個 stack 和 queue,而只須保證資料結構相同且元素總數不超過定義上限即可。
結構
Node
本結構為資料的進入點,其中 struct Data 為供使用者存取資料的結構,_next 則是保證結構正運作的必要參數,請不要任意更改它除非你清楚了解它的作用。
Stack
本結構為堆疊的主結構,使用他來宣告一個新的堆疊,結構中的 top 指標恆指向該堆疊最頂端的元素。
函式
push()
本函式會新增一筆資料至目標堆疊的頂端。
參數
stk (Stack*)
本參數為目標堆疊。
val (Node)
本參數為存入目標堆疊頂層的元素。
回傳值
本函式無回傳值。
pop()
本函式會將目標堆疊頂層的資料取出並回傳該元素。
stk (Stack*)
本參數為目標堆疊。
回傳值
本函式回傳目標堆疊頂層元素。
其他
ENTSIZ
此巨集用來定義元素的數量上限。
實例
| #include <stdio.h>#define ENTSIZ 1024
 
 typedef struct
 {
 struct Data
 {
 int a, b;
 };
 struct Node* _next;
 }Node;
 
 typedef struct
 {
 Node* top;
 }Stack;
 
 Node entries[ENTSIZ], * entry = entries, * freeBuk;
 
 inline void push(register Stack* stk, register Node val)
 {
 if (freeBuk)
 {
 Node* tmp = freeBuk->_next;
 *freeBuk = val, freeBuk->_next = stk->top;
 stk->top = freeBuk;
 freeBuk = tmp;
 }
 else
 {
 *entry = val, entry->_next = stk->top;
 stk->top = entry++;
 }
 }
 
 inline Node pop(register Stack* stk)
 {
 Node* tmp = stk->top;
 stk->top = stk->top->_next;
 tmp->_next = freeBuk;
 return *(freeBuk = tmp);
 }
 
 int main()
 {
 Stack stack1 = { 0 }, stack2 = { 0 };
 Node n = { 0, 1 };
 push(&stack1, n);
 n.b = 2;
 push(&stack2, n);
 push(&stack1, pop(&stack2));
 n = pop(&stack1);
 printf("%d,%d\n", n.a, n.b);
 printf("%d,%d\n", stack1.top->a, stack1.top->b);
 n = pop(&stack1);
 printf("%d,%d", n.a, n.b);
 return 0;
 }
 
 | 
編譯運行結果
0,2
0,1
0,1
注意事項
- 如果自定義資料較大,你應該將存取方式改為使用指標,並透過映射的方式存取資料來減少記憶體的操作次數。
- 如果要同時使用 Stack 和 Queue,請將兩者的 push() 和 pop() 函式用不同名字區隔開來。
- 測試階段,謹慎使用。
更新紀錄
2019-9-21
- 調整運作結構使其能和 Queue 混用同一塊記憶體 (在資料結構相同的情況)
- 優化 pop(),現在比之前少執行一行命令。