码迷,mamicode.com
首页 > 编程语言 > 详细

C语言---堆栈(链表实现)

时间:2019-10-17 21:53:11      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:orm   pre   中缀表达式   遍历   img   寄存器   概念   tst   存储过程   

一:堆栈的引入

堆栈可以比较好的解决后缀表达式的问题。

拓展一:

中缀表达式:运算符号位于两个运算数之间;例如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");
}

 

运行结果图

技术图片

 

C语言---堆栈(链表实现)

标签:orm   pre   中缀表达式   遍历   img   寄存器   概念   tst   存储过程   

原文地址:https://www.cnblogs.com/changfan/p/11695212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!