zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    【算法】273-每周一练 之 数据结构与算法(Tree)
    【算法】272-每周一练 之 数据结构与算法(Dictionary 和 HashTable)
    【CSS】271- RGB、HSL、Hex网页色彩,看完这篇全懂了
    【Redis】270- 你需要知道的那些 redis 数据结构
    Hybird App 应用开发中5个必备知识点复习
    【Vuejs】269- 提升90%加载速度——vuecli下的首屏性能优化
    【富文本】268- 富文本原理了解一下?
    HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (二)
    HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (一)
    HTML5 CSS3 专题 : 拖放 (Drag and Drop)
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/6945145.html
Copyright © 2011-2022 走看看