zoukankan      html  css  js  c++  java
  • 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("栈已清空!
    ");
    }

    运行结果图

    非学无以广才,非志无以成学。 正是因为今天的不完美,才对未来充满希望。 ----长帆
  • 相关阅读:
    C语言printf语法
    Android动画
    【转】Android内存(内存溢出 内存不足 内存低 .)优化详解
    Android dialog在有的手机上宽度不能充满屏幕的问题
    ios单例模式(Singleton)
    给ImageButton设置按下的效果
    Dynamics CRM Entity Relationship Many to Many (N:N)
    Python实现Mysql数据库连接池
    python获取指定时间差的时间
    Visual studio debug—Process with an Id of 5616 is not running的解决方法
  • 原文地址:https://www.cnblogs.com/changfan/p/11695212.html
Copyright © 2011-2022 走看看