• 栈程序演示:创建空栈、压栈、出栈、遍历、清空


      1 #include<stdio.h>
      2 #include<malloc.h>
      3 #include<stdlib.h>
      4 
      5 typedef struct Node{
      6     int data;//数据域
      7     struct Node * pNext;
      8 }NODE,*PNODE;
      9 
     10 typedef struct Stack{
     11     PNODE pTop;//指向栈的顶部节点
     12     PNODE pBottom;//指向栈的底部节点
     13 }STACK,* PSTACK;
     14 
     15 //函数声明
     16 void init(PSTACK);//初始化一个空栈,使pTop和pBottom都指向头结点
     17 void push(PSTACK,int);//存元素,压栈
     18 void traverse(PSTACK);//遍历
     19 bool pop(PSTACK,int *);//出栈并且返回出栈元素,还要判断出栈是否成功
     20 bool empty(PSTACK);//判断栈是否为空
     21 void clear(PSTACK);//清空数据
     22 
     23 int main(){
     24     STACK S;//等价于struct Stack S,分配一块内存空间名为S
     25           //里面有pTop和pBottom,暂时是垃圾值
     26    int val;       
     27     
     28     init(&S);//初始化一个空栈,使pTop和pBottom都指向头结点
     29     push(&S,1);//存元素,压栈
     30      push(&S,2);//存元素,压栈     
     31     traverse(&S);//遍历
     32     clear(&S);//清空
     33     
     34     if(pop(&s,&val)){//删元素,出栈
     35         printf("出栈成功,出栈元素的是%d
    ",val);
     36     }
     37     else{
     38         printf("出栈失败");
     39     }
     40     
     41     return 0;
     42 }
     43 
     44 void init(PSTACK pS){
     45     pS->pTop = (PNODE)malloc(sizeof(NODE));
     46     
     47     if(pS->pTop==NULL){
     48         printf("动态内存分配失败");
     49         exit(-1);//程序终止
     50     }
     51     else{
     52         pS->pBottom=pS->pTop;//空栈情况下,栈顶和栈底都指向同一个地址
     53         //即最后一个有效节点的下一个节点
     54         pS->pTop->pNext=NULL;//pS->pBottom->pNext==NULL
     55         //pS的成员pTop指向的头结点的指针域为空
     56     }
     57 }
     58 
     59 void push(PSTACK pS,int val){
     60     PNODE pNew = (PNODE)malloc(sizeof(NODE));//创建新结点
     61     pNew->data = val;
     62     pNew->pNext = pS->pTop;//使新节点的指针域指向原来的栈顶节点,
     63                            //不能是ps->pBottom
     64     pS->pTop = pNew;//使栈顶指向新节点地址
     65     
     66     return ;
     67 }
     68 
     69 void traverse(PSTACK pS){
     70     PNODE p = pS->PTop;//临时指针指向栈顶
     71     while(p != pS->pBototm){//若p还没有栈底pBottom,则遍历输出
     72         printf("%d ",p->data);//从栈顶开始输出
     73         p=p->pNext;
     74     }
     75     printf("
    ");
     76     return ;
     77 }
     78 
     79 bool empty(PSTACK pS){
     80     if(pS->pTop == pS->pBottom) return true;//当栈底和栈顶指向同一块地址,为空栈
     81     esle return false;
     82 }
     83 
     84 //把pS所指向的栈出栈一次,并把出栈的元素存入val形参所指向的变量中,
     85 //出栈成功返回true,失败返回false
     86 bool pop(PSTACK pS,int * val){
     87     if(empty(pS)) return false;
     88     els{
     89         *val = pS->data;//主函数里输出出栈元素
     90         PNODE r = pS->pTop;//临时指针r指向出栈元素位置:栈顶,方便最后释放内存
     91         ps->pTop = r->pNext;//栈顶指针指向原来栈顶的下一个节点地址
     92         free(r);
     93         r = NULL;
     94         return true;
     95     } 
     96 }
     97 
     98 void clear(PSTACK pS){//清空数据,最终使栈顶和栈底指向同一个地址
     99         if(empty(pS)){//如果栈本身为空,不需要清空
    100             return ;
    101         }
    102         else{
    103             PNODE p = pS->pTop;//临时指针P指向栈顶
    104             PNODE q = NULL;//临时指针q暂时设为NULL
    105             while(p != pS->pBottom){//当栈顶指针不指向栈底时,栈不为空
    106                 q = p->pNext;//临时指针q指向下一个节点
    107                 free(p);//释放p的内存
    108                 p = q;//再使p指向下一节点地址
    109             }
    110         }
    111     pS->pTop = pS->pBottom;//最后数据全部清空,栈顶和栈底指向同一个地址
    112 }
  • 相关阅读:
    [置顶] 也论百度轻应用--一个开发者的吐槽
    HDU 1506 Largest Rectangle in a Histogram
    [置顶] 搭建apache+tomcat+memcached集群环境
    (step8.2.6)hdu 1848(Fibonacci again and again——组合博弈)
    SQL2005、2008、2000 清空删除日志
    网络获取北京时间和系统时间
    C++界面库
    Cocos2d-X游戏开发之Windows7+VS2010环境搭建(亲测)
    华为面试题——一道关于指针方面的编程题(C/C++)
    java之Math
  • 原文地址:https://www.cnblogs.com/sunbr/p/11341842.html
Copyright © 2020-2023  润新知