帶首尾指標棧的構建(基於順序機構)

2021-09-23 20:23:18 字數 1683 閱讀 6750

完整測試用例

棧是受限的線性表,其只允許在棧首進行插入和刪除操作。棧在表示式求值、過程呼叫、遞迴過程和消除遞迴中有很中很要的作用。棧基於順序結構的好處是避免了指標的使用(可用整數來表是棧首的位置)易於理解,但缺點是大小固定(解決方法是動態的分配記憶體,具體可參見我的動態分配順序表一文,這裡不過多贅述)。我這裡採用了帶首尾指標的棧,這樣的棧可以很好的去實現輸出或輸入受限的棧,感興趣的同學可以在我的繼基礎上去實現一下兩端輸出或輸入受限的棧。

使用陣列來儲存,使用下表來表示棧首。

typedef struct  stack;
這裡的top指標指向棧頂的上乙個位置,由於c語言下表的起始,top數值就可以表示棧中的元素個數了

//初始化棧 

stack* initstack()

利用上述top數值與元素個數的關係可以很容易的判斷棧是否為空

//入棧操作 

void push(stack* t,elemtype e)else

}

//出棧操作 

elemtype pop(stack* t)else

}

/*此程式用以使用順序儲存結構實現棧,主函式已作出測試。

若使用可將整數型別替換為指標來建立廣義棧。

#include #include #include #define maxsize 20 //設定棧的大小

typedef int elemtype;

typedef struct stack;

stack* initstack(); //初始化棧

bool stackempty(stack *t); //判斷棧是否為空

void push(stack* t,elemtype e); //將元素e入棧

elemtype pop(stack* t); //出棧

elemtype gettop(stack* t); //獲得棧頂元素

void clearstack(stack* t); //銷毀棧

void printall(stack* t); //輸出棧

int getlong(stack* t); //獲得棧中元素個數

int main()

//初始化棧

stack* initstack()

//判斷棧是否為空

bool stackempty(stack *t)else

}//入棧操作

void push(stack* t,elemtype e)else

}//出棧操作

elemtype pop(stack* t)else

}//獲得棧頂元素

elemtype gettop(stack* t)else

}//銷毀棧

void clearstack(stack* t)

//獲得棧中元素個數

void printall(stack* t)

printf("end");

}int getlong(stack* t)

測試結果

棧 進棧,出棧指標修改的順序問題

策略 設計乙個順序棧,附設的top指標有兩種策略 借助一篇文章深入分析二者的異同。top指向棧頂 首先令top指向當前棧頂元素,這樣進來乙個新的元素時,新元素不能佔據當前top指向的位置,需要把top指標挪一挪,一般是top 但不排除題目中設計的是top 不管怎樣,都是把top指標往棧外拓展乙個空位...

基於順序儲存結構的棧StaticStack的實現

棧頂 top 允許操作的一端 棧底 bottom 不允許操作的一端 ifndef stack h define stack h include object.h namespace dtlib endif 1 使用原生陣列作為棧的儲存空間 2 使用模極引數決定棧的最大容量 3 用乙個標識不斷跟蹤棧頂...

基於順序表實現棧的基本操作

棧 什麼是棧?又該怎麼理解呢?下面實現棧的基本操作 seqstack.h檔案內容 pragma once include include typedef char seqstacktype typedef struct seqstack seqstack void seqstackinit seqs...