栈的创建、遍历、压栈与入栈

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <malloc.h>
  4 #include <stdbool.h>
  5     
  6 typedef struct Node{
  7     int data;
  8     struct Node * pNext;
  9 }NODE, *PNODE;
 10 
 11 typedef struct Stack{
 12     PNODE pTop;
 13     PNODE pBottom;
 14 }STACK, *PSTACK;        //PSTACK等价于struct Stack
 15 
 16 void initStack(PSTACK pS);
 17 void pushStack(PSTACK pS, int val);
 18 bool popStack(PSTACK pS, int *pVal);
 19 void traverse(PSTACK pS);
 20 bool isEmpty(PSTACK pS);
 21 void clear(PSTACK pS);
 22 
 23 int main()
 24 {
 25     int val;
 26     STACK s;        //STACK等价于struct Stack;
 27     initStack(&s);
 28     pushStack(&s, 1);
 29     pushStack(&s, 2);
 30     pushStack(&s, 3);
 31     pushStack(&s, 4);
 32     pushStack(&s, 5);
 33     pushStack(&s, 6);
 34     traverse(&s);
 35     if(popStack(&s, &val)){
 36         printf("出栈成功!\n");
 37         printf("出栈的元素是:%d!\n", val);
 38     }else{
 39         printf("出栈失败!\n");
 40     }
 41     
 42     traverse(&s);
 43     
 44     clear(&s);
 45     traverse(&s);
 46     
 47     system("pause");
 48     return 0;
 49 }
 50 
 51 void initStack(PSTACK pS){
 52     
 53     pS->pTop = (PNODE)malloc(sizeof(NODE));
 54     if(NULL == pS->pTop){
 55         printf("动态内存分配失败!\n");
 56         exit(-1);
 57     }else{
 58         pS->pBottom = pS->pTop;
 59         pS->pTop->pNext = NULL;        //pS->pBottom->pNext = NULL;
 60                                     //头节点所指向的指针域为空
 61     }
 62 }
 63 
 64 void pushStack(PSTACK pS, int val){
 65     PNODE pNew = (PNODE)malloc(sizeof(NODE));
 66     pNew->data = val;
 67     pNew->pNext = pS->pTop;        //    pS->pTop不能改成pS->pBotton
 68     pS->pTop = pNew;            //栈顶指向新节点
 69     return ;
 70 }
 71 
 72 
 73 void traverse(PSTACK pS){
 74     PNODE p = pS->pTop;
 75     printf("遍历栈:\n");
 76     while(p != pS->pBottom){
 77         printf("%d   ", p->data);
 78         p = p->pNext;
 79     }
 80     printf("\n");
 81 }
 82 
 83 bool isEmpty(PSTACK pS){
 84     if(pS->pTop == pS->pBottom)
 85         return true;
 86      else
 87         return false;
 88 }
 89 
 90 //把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中
 91 bool popStack(PSTACK pS,int *pVal){
 92     if(isEmpty(pS)){        //pS本身存放的就是S的地址
 93         printf("出栈失败!\n");
 94         return false;
 95     }
 96    
 97     PNODE r = pS->pTop;
 98     *pVal = r->data;
 99     pS->pTop = r->pNext;
100     free(r);
101     r = NULL;
102     return true; 
103 }
104 
105 void clear(PSTACK pS){
106     if(isEmpty(pS)){
107         return;
108     }
109 
110     PNODE p = pS->pTop;
111     PNODE q = NULL;
112     while(p != pS->pBottom){
113         q = p->pNext;
114         free(p);
115         p = q;
116     }
117     pS->pTop = pS->pBottom;
118 }

 

posted @ 2016-06-02 11:22  陆放为  阅读(994)  评论(0编辑  收藏  举报