棧可以是順序棧,也可以是鏈棧。
順序棧:
1const
int maxsize = 100;2
//順序棧
3struct
sqstack78
void initstack(sqstack &s)912
13int
isempty(sqstack s)
1420
21int push(sqstack &s,int
x)22
2930
int pop(sqstack &s,int &x)
31
順序棧還可以更簡化,使用陣列來建立:
1//簡化版順序棧
2int
stack[maxsize];
3int top = -1; //
初始化棧
4 stack[++top] = x; //
進棧5 x = stack[top--]; //
出棧
鏈棧:
1//鏈棧
2struct
lnode67
void initstack(lnode *&lst)812
13int isempty(lnode *lst)
1420
21void push(lnode *lst,int
x)22
3031
int pop(lnode *lst,int &x)
32
棧的應用:
1. 編寫演算法,判斷乙個算術表示式中的括號是否配對。表示式已經存入字元陣列中,元素從下標1開始儲存,表示式中的字元個數為n
思路:遍歷這個表示式,當遇到第乙個 '(' 時,入棧,繼續遍歷,如果遇到 ')' ,則將 '(' 出棧,劃掉這兩個括號,繼續處理下一組括號。如果前面所有括號都被劃掉,而下乙個括號卻是 ')' ,
則括號不匹配,因為前面已經沒有與之匹配的 '(' 了。如果下乙個括號還是 '(' ,則先處理這個括號,處理完再處理前面的 '(' 。
1int match(char exp,intn)2
16}17if(top==-1) //
所有括號都被處理掉了,返回1
18return
1;
19else
//否則返回0
20return0;
21 }
2.編寫乙個函式,求字尾表示式的值。(即逆波蘭表示式的值) 表示式被存於乙個字元陣列中,以'\0'結尾,並假設字尾表示式中的數字都只有一位。
先定義乙個運算函式:
1int op(int a,char op, intb)2
else
11return a/b;12}
13 }
字尾表示式計算函式:
1int com(char
exp)
2 19}
20return
stack[top];
21 }
棧的基本操作及其應用
這裡順序棧和鏈棧的基本操作和差別在之前的線性表操作中是一樣的,目前棧對我而言在實際使用中使用哪一種差別並沒有很大,順序棧用起來會方便一點 順序棧 adt typedef struct seqstack 入棧 int push seqstack s,datatype x 出棧 int pop seqs...
棧及其應用
棧又稱堆疊,是一種運算受限的線性表,其限制是僅允許在表的一端進行插入和刪除運算。把對棧進行運算的一端稱為棧頂,另一端稱為棧底。向乙個棧插入新元素稱為入棧或進棧,push 從乙個棧刪除元素稱為退棧或出棧,pop。因為後進棧的元素必定先出棧,所以又把棧稱為後進先出表 last in first out,...
棧及其簡單應用
棧是一種特殊的線性表 是一種先進後出表 filo 只有棧頂元素才能被操作 特殊 棧具有特殊的儲存訪問結構 棧的操作 入棧 向棧中儲存資料元素 push 出棧 從棧中取出元素 pop 棧頂指標 top 用來指向最後乙個入棧元素 棧滿 上溢 不可入棧 top size 1 入棧操作 top top 1 ...