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

  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\n",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("\n");
 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 }

 

posted @ 2019-08-12 18:40  孙晨c  阅读(1550)  评论(0编辑  收藏  举报