C語言---堆棧(鏈表實現)


一:堆棧的引入

堆棧可以比較好的解決后綴表達式的問題。

拓展一:

中綴表達式:運算符號位於兩個運算數之間;例如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");
}

 

運行結果圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM