数据结构作业的代码——————栈的顺序实现

﹏ヽ暗。殇╰゛Y 2022-05-09 11:12 264阅读 0赞

作业code1:

  • 将上课给的顺序表形式实现栈的程序补充(代码已发给大家):
  • 实现通过键盘进行插入
  • 实现通过键盘进行删除
  • 良好的人机交互

发的代码:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. typedef int SElemType;
  4. typedef int Status;
  5. #define INIT_SIZE 100
  6. #define STACKINCREMENT 10
  7. #define Ok 1
  8. #define Error 0
  9. #define True 1
  10. #define False 0
  11. typedef struct
  12. {
  13. SElemType *base;
  14. SElemType *top;
  15. int stacksize;
  16. } SqStack;
  17. //初始化栈
  18. Status InitStack(SqStack *s)
  19. {
  20. s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
  21. if(!s->base)
  22. {
  23. puts("存储空间分配失败!");
  24. return Error;
  25. }
  26. s->top = s->base;
  27. s->stacksize = INIT_SIZE;
  28. return Ok;
  29. }
  30. //清空栈
  31. Status ClearStack(SqStack *s)
  32. {
  33. s->top = s->base;
  34. return Ok;
  35. }
  36. //栈是否为空
  37. Status StackEmpty(SqStack *s)
  38. {
  39. if(s->top == s->base)
  40. return True;
  41. else
  42. return False;
  43. }
  44. //销毁栈
  45. Status Destroy(SqStack *s)
  46. {
  47. free(s->base);
  48. s->base = NULL;
  49. s->top = NULL;
  50. s->stacksize=0;
  51. return Ok;
  52. }
  53. //获得栈顶元素
  54. Status GetTop(SqStack *s, SElemType &e)
  55. {
  56. if(s->top == s->base)
  57. return Error;
  58. e = *(s->top - 1);
  59. return Ok;
  60. }
  61. //压栈
  62. Status Push(SqStack *s, SElemType e)
  63. {
  64. if(s->top - s->base >= s->stacksize)//栈满
  65. {
  66. s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType));
  67. if(!s->base)
  68. {
  69. puts("存储空间分配失败!");
  70. return Error;
  71. }
  72. s->top = s->base + s->stacksize;//修改栈顶位置
  73. s->stacksize += STACKINCREMENT;//修改栈长度
  74. }
  75. *s->top++ = e;
  76. return Ok;
  77. }
  78. //弹栈
  79. Status Pop(SqStack *s, SElemType *e)
  80. {
  81. if(s->top == s->base)
  82. return Error;
  83. --s->top;
  84. *e = *(s->top);
  85. return Ok;
  86. }
  87. //遍历栈
  88. Status StackTraverse(SqStack *s,Status(*visit)(SElemType))
  89. {
  90. SElemType *b = s->base;//此处不能直接用base或top移动,即不能改变原栈的结构
  91. SElemType *t = s->top;
  92. while(t > b)
  93. visit(*b++);
  94. printf("\n");
  95. return Ok;
  96. }
  97. Status visit(SElemType c)
  98. {
  99. printf("%d ",c);
  100. return Ok;
  101. }
  102. int main()
  103. {
  104. SqStack a;
  105. SqStack *s = &a;
  106. SElemType e;
  107. InitStack(s);
  108. int n;
  109. puts("请输入要进栈的个数:");
  110. scanf("%d", &n);
  111. while(n--)
  112. {
  113. int m;
  114. scanf("%d", &m);
  115. Push(s, m);
  116. }
  117. StackTraverse(s, visit);
  118. puts("");
  119. puts("8进栈后:");
  120. Push(s, 8);
  121. StackTraverse(s, visit);
  122. puts("");
  123. Pop(s, &e);
  124. printf("出栈的元素是:%d\n", e);
  125. printf("元素出栈后事实上并没有清除,依然存在于内存空间,所谓的出栈只是指针移动,出栈的元素是%d\n", *s->top);//判断出栈后元素是否还存在于内存中
  126. Destroy(s);
  127. return 0;
  128. }
  • J17-4-name-code-第二次-栈.cpp

感觉就是给它换了个衣服,函数基本上都没有发上变化
明天 还需要写栈的链式实现

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <iostream>
  4. using namespace std;
  5. typedef int SElemType;
  6. typedef int Status;
  7. #define INIT_SIZE 100
  8. #define STACKINCREMENT 10
  9. #define Ok 1
  10. #define Error 0
  11. #define True 1
  12. #define False 0
  13. typedef struct
  14. {
  15. SElemType *base;
  16. SElemType *top;
  17. int stacksize;
  18. } SqStack;
  19. //初始化栈
  20. Status InitStack(SqStack *s)
  21. {
  22. s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
  23. if(!s->base)
  24. {
  25. puts("存储空间分配失败!");
  26. return Error;
  27. }
  28. s->top = s->base;
  29. s->stacksize = INIT_SIZE;
  30. return Ok;
  31. }
  32. //清空栈
  33. Status ClearStack(SqStack *s)
  34. {
  35. s->top = s->base;
  36. return Ok;
  37. }
  38. //栈是否为空
  39. Status StackEmpty(SqStack *s)
  40. {
  41. if(s->top == s->base)
  42. return True;
  43. else
  44. return False;
  45. }
  46. //销毁栈
  47. Status Destroy(SqStack *s)
  48. {
  49. free(s->base);
  50. s->base = NULL;
  51. s->top = NULL;
  52. s->stacksize=0;
  53. return Ok;
  54. }
  55. //获得栈顶元素
  56. Status GetTop(SqStack *s, SElemType &e)
  57. {
  58. if(s->top == s->base)
  59. return Error;
  60. e = *(s->top - 1);
  61. return Ok;
  62. }
  63. //压栈
  64. Status Push(SqStack *s, SElemType e)
  65. {
  66. if(s->top - s->base >= s->stacksize)//栈满
  67. {
  68. s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType));
  69. if(!s->base)
  70. {
  71. puts("存储空间分配失败!");
  72. return Error;
  73. }
  74. s->top = s->base + s->stacksize;//修改栈顶位置
  75. s->stacksize += STACKINCREMENT;//修改栈长度
  76. }
  77. *s->top++ = e;
  78. return Ok;
  79. }
  80. //弹栈
  81. Status Pop(SqStack *s, SElemType *e)
  82. {
  83. if(s->top == s->base)
  84. return Error;
  85. --s->top;
  86. *e = *(s->top);
  87. return Ok;
  88. }
  89. //遍历栈
  90. Status StackTraverse(SqStack *s,Status(*visit)(SElemType))
  91. {
  92. SElemType *b = s->base;//此处不能直接用base或top移动,即不能改变原栈的结构
  93. SElemType *t = s->top -1;
  94. while(t >= b)
  95. visit(*t--);
  96. // visit(*b++);
  97. printf("\n");
  98. return Ok;
  99. }
  100. Status visit(SElemType c)
  101. {
  102. printf("%d ",c);
  103. return Ok;
  104. }
  105. void menu()
  106. {
  107. cout<<" menu:"<<endl;
  108. cout<<"1.进栈"<<endl;
  109. cout<<"2.出栈"<<endl;
  110. cout<<"3.输出"<<endl;
  111. cout<<"4.menu"<<endl;
  112. cout<<"0.结束"<<endl;
  113. }
  114. void preface()
  115. {
  116. printf(" *********************************************\n"
  117. " * *\n"
  118. " * 此程序的功能: *\n"
  119. " * 将整数类型的数据进行栈的操作 *\n"
  120. " * *\n"
  121. " *********************************************\n"
  122. "\n\n"
  123. );
  124. }
  125. int main()
  126. {
  127. SqStack a;
  128. SqStack *s = &a;
  129. SElemType e;
  130. InitStack(s);
  131. preface();
  132. menu();
  133. int choose;
  134. int x;
  135. while(true)
  136. {
  137. cout<<"\n请选择:";
  138. cin>>choose;
  139. int k=0;
  140. switch(choose)
  141. {
  142. case 1:
  143. printf("请输出需要进栈的个数:");
  144. cin>>x;
  145. printf("请输入%d个元素:",x);
  146. while(x--)
  147. {
  148. cin>>e;
  149. Push(s,e);
  150. }
  151. // printf("进栈成功!\n");
  152. break;
  153. case 2:
  154. Pop(s,&e);
  155. printf("出栈的元素是:%d\n", e);
  156. break;
  157. case 3:
  158. StackTraverse(s, visit);
  159. printf("栈已全部输出!\n");
  160. break;
  161. case 4:
  162. menu();
  163. break;
  164. case 0:
  165. k=1;
  166. break;
  167. default:
  168. printf("请重新输入!");
  169. break;
  170. }
  171. if(k) break;
  172. }
  173. Destroy(s);
  174. return 0;
  175. }

发表评论

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

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

相关阅读