• 33_栈程序演示.swf


    pBottom执行栈底有效元素的前一个节点,该节点没有存储有效数据,这样设计是便于栈的管理,向链表一样pHead指向链表的第一个节点,该节点是不存储有效数据的

    pTop执行栈顶最新的节点

    如果pTop和pBottom的值一样,说明栈是空的

    经过初始化栈之后,栈的结构是:

    向栈中添加一个数据

    所以pBottom永远执行栈顶有效节点的前一个节点,该节点不存储有效数据,该节点的pNext下一个节点为NULL

    #include<stdio.h>
    #include<malloc.h>
    #include <stdio.h>  
    #include <stdlib.h>  
    
    /*
    使用链表使用一个栈的数据结构 
    
    */ 
    //定义一个链表的节点 
    typedef struct Node{
        int data;//数据域
        struct Node * pNext; 
    }NODE,*PNODE;
    
    
    typedef struct Stack{
        PNODE pTop; //栈顶指针 
        PNODE pBottom; //栈底的指针 
    }STACK,*PSTACK;  //STACK等价于 struct Stack, PSTACK等价于 struct Stack* 
    
    
    /*初始化栈
    void init(struct Stack*  pStack){
    */
    void initStack(PSTACK pStack){
        pStack->pTop  = (PNODE)malloc(sizeof(NODE));
        if(NULL == pStack->pTop ){
            printf("分配内存失败");
            exit(-1);
        }else{
            pStack->pBottom = pStack->pTop;//二者指向同一个内存单元
            pStack->pBottom->pNext = NULL; //pBottom指向栈底有效节点的前一个节点,该节点不存储有效数据,该节目之前没有任何其他节点 
        }
        
    }
    
    /*
    将数据放入栈中 
    
    */
    void pushStack(PSTACK pStack,int val){
            PNODE pNew  = (PNODE)malloc(sizeof(NODE));//产生一个新的节点 
            pNew->data = val;//把值添加到新的节点中 
            pNew->pNext = pStack->pTop;//让新的节点的下一个节点等于现在栈顶
            pStack->pTop = pNew;//最新栈顶的值等于最新的节点
                 
    }
    
    /**对栈的数据进行遍历操作
    栈的数据是先进后出 
    定义一个变量p,在遍历的时候只有p不等于pBottom,就可以将p的值输出 
    */
    
    void  traverse(PSTACK pStack){
            PNODE p =  pStack->pTop;
            //对p进行遍历输出
             while(p != pStack->pBottom){
                 //输出变量的结果
                 printf("%d
    ",p->data); 
                 p = p->pNext;
             }
    } 
    
    int main(){
        STACK s;//
        initStack(&s);
        pushStack(&s,1);
        pushStack(&s,2);
        pushStack(&s,3);
        pushStack(&s,4);
        traverse(&s);
        return 0;
    }

    我们来看程序的运行效果是:

     可以完善下面的代码:

    #include<stdio.h>
    #include<malloc.h>
    #include <stdio.h>  
    #include <stdlib.h>  
    
    /*
    使用链表使用一个栈的数据结构 
    
    */ 
    //定义一个链表的节点 
    typedef struct Node{
        int data;//数据域
        struct Node * pNext; 
    }NODE,*PNODE;
    
    
    typedef struct Stack{
        PNODE pTop; //栈顶指针 
        PNODE pBottom; //栈底的指针 
    }STACK,*PSTACK;  //STACK等价于 struct Stack, PSTACK等价于 struct Stack* 
    
    
    /*初始化栈
    void init(struct Stack*  pStack){
    */
    void initStack(PSTACK pStack){
        pStack->pTop  = (PNODE)malloc(sizeof(NODE));
        if(NULL == pStack->pTop ){
            printf("分配内存失败");
            exit(-1);
        }else{
            pStack->pBottom = pStack->pTop;//二者指向同一个内存单元
            pStack->pBottom->pNext = NULL; //pBottom指向栈底有效节点的前一个节点,该节点不存储有效数据,该节目之前没有任何其他节点 
        }
        
    }
    
    /*
    将数据放入栈中 
    
    */
    void pushStack(PSTACK pStack,int val){
            PNODE pNew  = (PNODE)malloc(sizeof(NODE));//产生一个新的节点 
            pNew->data = val;//把值添加到新的节点中 
            pNew->pNext = pStack->pTop;//让新的节点的下一个节点等于现在栈顶
            pStack->pTop = pNew;//最新栈顶的值等于最新的节点
                 
    }
    
    
    /*判断栈是否是空*/
    bool isEmpty(PSTACK pStack){
        if(pStack->pTop == pStack->pTop){
            return true;//空栈 
        }else{
            return false;
        }
    }
    
    /*数据的出栈,将出栈的数据保存到int*val中*/
    bool  popStack(PSTACK pStack,int*val){
    
        if(isEmpty(pStack)){//栈是空的
          return false; 
            
        }else{
         PNODE p = pStack->pTop;
      (*val) = p->data;
      pStack->pTop = p->pNext;
      free(p); //一定要记得释放内存 
      p= NULL; 
      return true    
        }
     
    }
    
    
    /*清空栈的元素
    让栈回到初始化的状态 
    */
    void clear(PSTACK pStack){
        if(isEmpty(pStack)){//栈是空的
          return ;         
        }else{
         PNODE p = pStack->pTop;
          PNODE q = NULL;
          while(p != pStack->pBottom  ){
              q = p->pNext;
            free(p);
            p=q;        
          }    
          //最后
          pStack->pTop = pStack->pBottom; 
        }
        
        
    }
    
    
    /**对栈的数据进行遍历操作
    栈的数据是先进后出 
    定义一个变量p,在遍历的时候只有p不等于pBottom,就可以将p的值输出 
    */
    
    void  traverse(PSTACK pStack){
            PNODE p =  pStack->pTop;
            //对p进行遍历输出
             while(p != pStack->pBottom){
                 //输出变量的结果
                 printf("%d
    ",p->data); 
                 p = p->pNext;
             }
    } 
    
    int main(){
        STACK s;//
        initStack(&s);
        pushStack(&s,1);
        pushStack(&s,2);
        pushStack(&s,3);
        pushStack(&s,4);
        traverse(&s);
        return 0;
    }
  • 相关阅读:
    软件安装的list(0918)
    putty配色备份
    曹工谈Spring Boot:Spring boot中怎么进行外部化配置,一不留神摔一跤;一路debug,原来是我太年轻了
    使用Hystrix的插件机制,解决在使用线程隔离时,threadlocal的传递问题
    曹工谈并发:Synchronized升级为重量级锁后,靠什么 API 来阻塞自己
    曹工力荐:调试 jdk 中 rt.jar 包部分的源码(可自由增加注释,修改代码并debug)
    曹工杂谈--只用一个命令,centos系统里装了啥软件,啥时候装的,全都清清楚楚
    曹工说Redis源码(7)-- redis server 的周期执行任务,到底要做些啥
    曹工说Redis源码(6)-- redis server 主循环大体流程解析
    曹工说Redis源码(5)-- redis server 启动过程解析,以及EventLoop每次处理事件前的前置工作解析(下)
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/6945145.html
Copyright © 2020-2023  润新知