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("栈创建成功!
"); 
}

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 已出栈!
",*val);
} 

void TraverseStack(PSTACK Stack){
    if (IsEmpty(Stack)){
        printf("遍历栈失败,栈已空!
"); 
    }
    PNODE P = Stack->PTOP;
    printf("遍历栈中的元素为:");
    while(P != Stack->PBOOTOM){
        printf("%d
",P->Element);
        P = P->next;
    } 
}

bool IsEmpty(PSTACK Stack){
    if(Stack->PTOP == Stack->PBOOTOM){
        printf("栈为空!
");
        return true; 
    }
    else{
        return false;
    }
}

void ClearStack(PSTACK Stack){
    if(IsEmpty(Stack)){
        printf("栈为空,无需再清除!
");
    }
    PNODE P = Stack->PTOP;
    PNODE S = NULL;
    
    while(P != Stack->PBOOTOM){
        S = P->next;
        free(P);
        P = S;
    }
    Stack->PTOP = Stack->PBOOTOM;
    printf("栈已清空!
");
}

运行结果图

非学无以广才,非志无以成学。 正是因为今天的不完美,才对未来充满希望。 ----长帆
原文地址:https://www.cnblogs.com/changfan/p/11695212.html