数据结构之线性结构之堆栈
生活随笔
收集整理的這篇文章主要介紹了
数据结构之线性结构之堆栈
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二,堆棧
?
中綴表達式:運算符位于兩數之后; a+b*c-d/e
后綴表達式:運算符位于兩數之后; abc*+de/-;計算機表示式求解時的讀法;用堆棧實現計算
前綴表達式:運算符位于兩數之前; -+a*bc/de
?
堆棧(操作受限制的線性表),先入后出,只在一端(棧頂,top)做插入和刪除
push和pop為最常用的操作,可以交替進行;
棧的順序存儲實現:用數組實現堆棧
#define MAXSIZE 10 typedef struct {int Data[MAXSIZE];int Top; //指向棧頂的位置 }Stack;?
void Push(Stack *PtrS, int item)//item為待插入元素 {if (PtrS->Top == MAXSIZE){printf("堆棧滿"); return;}else{PtrS->Data[++(PtrS->Top)] = item;//先把指向top的指針指向下一位,再往該位置插入數字return;} }?
int Pop(Stack *PtrS) {if (PtrS->Top==-1){printf("棧為空");return -NAN; //此處只要是特殊值,標志錯誤 }else{return(PtrS->Data[(PtrS->Top)--]);//返回棧頂的值之后需要把棧頂的指針的值往下移動一位 } }?
一個數組實現兩個堆棧:一個指向數組頭,一個指向數組尾部,當兩個指針相鄰時,數組滿,即兩頭向中間生長
堆棧的鏈式存儲實現
用鏈表表示堆棧,鏈棧,實際是個單鏈表。插入和刪除操作只能在鏈棧的棧頂進行。即棧頂Top應該在鏈表的頭,不能在尾部(單向鏈表只能找到下一項,找不到上一項)
typedef struct NodeStack {int Data;struct NodeStack *Next; }LinkStack;void LinkPush(int item, LinkStack *S) {LinkStack *temp = new LinkStack;temp->Data = item;temp->Next = S->Next;S->Next = temp; }int LinkPop(LinkStack *S) {LinkStack *temp = new LinkStack;int result;if (S->Next == NULL){printf("堆棧空");return NULL;}else{temp = S->Next;//刪除某一個數時需要定位到該數之前的那個數S->Next = temp->Next;result = temp->Data;delete(temp);return result;} }中綴表達式轉換成后綴表達式:堆棧實現,復雜度為n
小于等于棧頂時,棧頂輸出
?
后綴表達式可以用堆棧求出其具體數值:
把運算數壓入棧中,遇到運算符,取出棧頂兩元素運算后的結果壓入棧中,繼續
堆棧其他作用:
轉載于:https://www.cnblogs.com/xiaoxue126/p/9036568.html
總結
以上是生活随笔為你收集整理的数据结构之线性结构之堆栈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 35张动图:关于机房空调水冷系统和风冷系
- 下一篇: 将二维数组名作为函数实参