链栈的实现


  1 /*链栈*/
  2 /*链栈的结构和各种基本操作都类似于线性链表
  3 *只是要注意它的插入和删除操作只能在栈顶进行
  4 *为了方便操作,我们将链表的头部作为栈顶
  5 */
  6 #include<stdio.h>
  7 #include<stdlib.h>
  8 
  9 //结构定义
 10 typedef struct node
 11 {
 12     elementType data;
 13     struct node *next; 
 14 } LSNode;//链栈节点 
 15 typedef struct
 16 {
 17     struct LSNode *top;
 18     int size;
 19 }*PSTACK;//链栈 
 20 typedef int elementType;
 21 
 22 //基本操作
 23 //注意:配合CreatStack(),应该有DisposeStack(PSTACK) 
 24  PSTACK CreatStack()
 25  {
 26      PSTACK p=NULL;
 27     p=(PSTACK)malloc(sizeof(*PSTACK));
 28      if(p==NULL)
 29      {
 30          printf("Cannot malloc for PSTACK\n");
 31          //根据内存分配失败,业务是否还能进行选择 
 32         //return NULL;
 33         exit(1); 
 34     }
 35     else
 36     {
 37         p->top=NULL;
 38         p->size=0;
 39         return p;
 40     }
 41  }
 42  int IsEmpty(PSTACK s)
 43  {
 44      if(s==NULL)
 45          return 1;
 46     else
 47         return 0;
 48  }
 49  void PopStack(PSTACK s)//出栈 
 50  {
 51      if(IsEmpty(s))
 52      {
 53         printf("Stack is Empty\n");
 54     }
 55     else
 56     {
 57         LSNode*p=NULL;
 58          p=s->top->next;
 59          free(s->top);
 60          s->top=p;
 61          s->size--;
 62     }
 63  }
 64  void MakeEmptyStack(PSTACK s)//清空栈 
 65  {
 66      while(s->top!=NULL)
 67     {
 68         //PopStack()中有重复判断,不爽大可以重写
 69         PopStack(s);  
 70     }
 71  }
 72  void DisposeStack(PSTACK s)//删除栈 
 73 {
 74      MakeEmptyStack(s);
 75      free(s);
 76 }
 77 void PushStack(elementType x, PSTACK s)//压栈,入栈 
 78 {
 79     LSNode*p=NULL;
 80     p=(LSNode*)malloc(sizeof(LSNode));
 81     if(p==NULL)
 82     {
 83         printf("Cannot malloc for LSNode\n");
 84         //根据内存分配失败,业务是否还能进行选择 
 85         //return NULL;
 86         exit(1);
 87     } 
 88     p->data=x;
 89     p->next=s->top;
 90     s->top=p;
 91     s->size++;
 92 }
 93 elementType TopStack(PSTACK s)//取栈顶元素
 94 {
 95     if(s->top==NULL)
 96         return NULL;
 97     else 
 98         return s->top->data;
 99 }
100 elementType TopAndPop(PSTACK s)//取栈顶元素,并出栈(栈空时返回NULL)
101 {
102     //因为使用此函数前提是已经判断了栈非空,这里不做重复判断
103     elementType x;
104     x=TopStack(s);
105     PopStack(s);
106     return x; 
107 }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM