一:堆棧的引入
堆棧可以比較好的解決后綴表達式的問題。
拓展一:
中綴表達式:運算符號位於兩個運算數之間;例如a + b * c - d/c;
后綴表達式:運算符號位於兩個運算數之后;例如ab * + de -;
這個時候就需要一種存儲辦法,能夠順序存儲運算數,並在需要的時候倒序輸出,這就需要堆棧。
二、堆棧的概念
堆棧是一個特定的存儲區或寄存器,它的一端是固定的,另一端是浮動的 。對這個存儲區存入的數據,是一種特殊的數據結構。所有的數據存入或取出,只能在浮動的一端(稱棧頂)進行,嚴格按照“先進后出”的原則存取,位於其中間的元素,必須在其棧上部(后進棧者)諸元素逐個移出后才能取出。
堆棧的存儲過程像一個堆碟子的過程,舊的碟子堆在下面,新碟子堆在上面,拿碟子的過程,也是先拿新碟子,最后才能拿到舊碟子。
三、堆棧的鏈表實現
#include<stdio.h> #include<stdlib.h> typedef int Elementtype; //定義節點 typedef struct Node{ Elementtype Element; struct Node *next; }NODE,*PNODE; //定義棧的結構體 typedef struct Stack{ PNODE PTOP; PNODE PBOOTOM; }STACK,* PSTACK; void InitStack(PSTACK Stack); void PushStack(PSTACK Stack,int val); void PopStack(PSTACK Stack,int *val); void TraverseStack(PSTACK Stack); bool IsEmpty(PSTACK Stack); void ClearStack(PSTACK Stack); int main(){ STACK Stack; int val = 0; InitStack(&Stack); IsEmpty(&Stack); PushStack(&Stack,100); PushStack(&Stack,100); PushStack(&Stack,100); PushStack(&Stack,100); IsEmpty(&Stack); PopStack(&Stack,&val); TraverseStack(&Stack); ClearStack(&Stack); return 0; } void InitStack(PSTACK Stack){ PNODE PNew = (PNODE)malloc(sizeof(NODE)); if(PNew == NULL){ printf("新結點空間的分配失敗!"); exit(-1); } Stack->PTOP = PNew; Stack->PBOOTOM = PNew; PNew->next = NULL; printf("棧創建成功!\n"); } void PushStack(PSTACK Stack,int val){ PNODE P = (PNODE)malloc(sizeof(NODE)); if(P == NULL){ printf("新結點空間的分配失敗!"); exit(-1); } P->Element=val; //將值賦給結點的賦值域 P->next = Stack->PTOP; //使新建的結點指向上一個結點 Stack->PTOP = P; //更新棧頂元素,使其指向新的結點 } void PopStack(PSTACK Stack,int *val){ if(Stack->PBOOTOM == Stack->PTOP){ printf("棧已空"); } PNODE P = Stack->PTOP; *val = P->Element; Stack->PTOP = P->next; free(P); P = NULL; printf("%d 已出棧!\n",*val); } void TraverseStack(PSTACK Stack){ if (IsEmpty(Stack)){ printf("遍歷棧失敗,棧已空!\n"); } PNODE P = Stack->PTOP; printf("遍歷棧中的元素為:"); while(P != Stack->PBOOTOM){ printf("%d\n",P->Element); P = P->next; } } bool IsEmpty(PSTACK Stack){ if(Stack->PTOP == Stack->PBOOTOM){ printf("棧為空!\n"); return true; } else{ return false; } } void ClearStack(PSTACK Stack){ if(IsEmpty(Stack)){ printf("棧為空,無需再清除!\n"); } PNODE P = Stack->PTOP; PNODE S = NULL; while(P != Stack->PBOOTOM){ S = P->next; free(P); P = S; } Stack->PTOP = Stack->PBOOTOM; printf("棧已清空!\n"); }
運行結果圖