【数据结构】顺序栈的实现

布满荆棘的人生 2021-09-16 10:42 499阅读 0赞
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #define STACK_INIT_SIZE 100
  5. #define STACKINCREMENT 10
  6. #define TURE 1
  7. #define FALSE 0
  8. #define OK 1
  9. #define ERROR 0
  10. #define INFEASIBLE -1
  11. #define OVERFLOW -2
  12. typedef int Status;
  13. typedef struct{
  14. char name[10];
  15. int stuNo;
  16. }SElemType;
  17. typedef struct{
  18. SElemType* base;//栈底指针,在栈构造和销毁之前,base的值NULL
  19. SElemType* top;//栈顶指针
  20. int stacksize;//当前已分配的存储空间,以元素为单位
  21. }SqStack;
  22. Status InitStack(SqStack &s){
  23. //构造一个空栈
  24. s.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
  25. if(!s.base) exit(OVERFLOW);
  26. s.top=s.base;
  27. s.stacksize=STACK_INIT_SIZE;
  28. return OK;
  29. }
  30. Status GetTop(SqStack s,SElemType &sElem){
  31. //如果栈不空,用sElem返回s的栈顶元素,并返回OK
  32. if(s.top==s.base) return ERROR;
  33. sElem = *(s.top-1);
  34. return OK;
  35. }
  36. Status Push(SqStack &s,SElemType sElem){
  37. //插a入sElem元素为新的栈顶元素
  38. if(s.top-s.base>=s.stacksize){
  39. //栈满,追加存储空间
  40. s.base = (SElemType*) realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
  41. if(!s.base) return OVERFLOW;
  42. s.top = s.base+s.stacksize;//重新使top指向栈顶
  43. s.stacksize+=STACKINCREMENT;
  44. }
  45. *s.top=sElem;
  46. s.top++;
  47. return OK;
  48. }
  49. Status Pop(SqStack &s,SElemType &sElem){
  50. //出栈操作
  51. //若栈不空,则删除栈顶元素,并用sElem返回其值
  52. //失败返回ERROR,成功返回OK
  53. if(s.base==s.top) return ERROR;
  54. sElem=*(--s.top);
  55. return OK;
  56. }
  57. Status EmptyStack(SqStack s){
  58. //判断栈是否为空,如果为空,返回TURE,否则返回FALSE
  59. if(s.base==s.top) return TURE;
  60. else return FALSE;
  61. }
  62. int StackLength(SqStack s){
  63. //返回栈的元素个数,即栈的长度
  64. return s.top-s.base;
  65. }
  66. Status DestroyStack(SqStack &s){
  67. //销毁栈
  68. s.top=s.base;
  69. free(s.base);
  70. s.stacksize=0;
  71. return OK;
  72. }
  73. void StackTraverse(SqStack s){
  74. //遍历打印栈中的内容
  75. SElemType* p=s.base;
  76. for(;p<s.top;p++){
  77. printf("%d %s \n",p->stuNo,p->name);
  78. }
  79. }
  80. int main()
  81. {
  82. SqStack s;
  83. InitStack(s);
  84. SElemType sElem;
  85. for(int i=0;i<3;i++){
  86. scanf("%d%s",&sElem.stuNo,sElem.name);
  87. Push(s,sElem);
  88. }
  89. StackTraverse(s);
  90. Pop(s,sElem);
  91. StackTraverse(s);
  92. }

发表评论

表情:
评论列表 (有 0 条评论,499人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构-顺序

    / 编写一个程序,实现顺序栈(假设栈中元素类型为char)的各种基本运算。并完成下面功能: (1)初始化栈s; (2)判断栈s是否非空;

    相关 数据结构 顺序

    做一个豁达而努力的自己。 栈的定义:只能在表的一端(栈顶)进行插入和删除的线性表。 逻辑结构:与线性表相同,仍为一一对应的关系。 存储结构:用顺序栈和链栈存储均可,但以顺