鱼C论坛

 找回密码
 立即注册
查看: 2581|回复: 30

[已解决]C语言栈

[复制链接]
发表于 2021-11-3 19:39:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
怎么才能做到图片上的输入效果,比如push 56为入栈,pop为出栈,end表示结束 屏幕截图 2021-11-03 162110.png 屏幕截图 2021-11-03 162057.png
最佳答案
2021-11-3 22:41:34
  1. /*
  2. #include "stdio.h"
  3. #include "stdlib.h"
  4. #include "string.h"
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>

  9. #define true 1
  10. #define false 0
  11. #define Status int

  12. typedef struct {
  13.     int *base;
  14.     int *top;
  15.     int stacksize;
  16. } SqStack;

  17. /*
  18. Status SS_Init(SqStack *S, int max);
  19. Status SS_IsFull(SqStack S);
  20. Status SS_IsEmpty(SqStack S);
  21. void SS_Length(SqStack S);
  22. Status SS_push(SqStack *S, int e);
  23. Status SS_pop(SqStack *S, int *e);
  24. */

  25. Status SS_Init(SqStack *S, int max) {
  26.     //S->base = (int *)malloc(max * sizeof(int));
  27.     S->base = malloc(max * sizeof(int));
  28.     //if(!(S->base)) exit(1);
  29.     if(!S->base) exit(1);
  30.     S->top = S->base;
  31.     S->stacksize = max;
  32.     return true;
  33. }

  34. // 为什么不写释放函数?
  35. void stack_deinit(SqStack *s) {
  36.     free(s->base);
  37. }

  38. //Status SS_IsFull(SqStack S) {
  39. Status SS_IsFull(SqStack *S) {
  40.     //if(S.top - S.base == S.stacksize) {
  41.     if(S->top - S->base == S->stacksize) {
  42.         return true;
  43.     } else {
  44.         return false;
  45.     }
  46. }

  47. //Status SS_IsEmpty(SqStack S) {
  48. Status SS_IsEmpty(SqStack *S) {
  49.     //if(S.top == S.base) {
  50.     if(S->top == S->base) {
  51.         return true;
  52.     } else {
  53.         return false;
  54.     }
  55. }

  56. //void SS_Length(SqStack S) { printf("Stack length:%d\n", S.top - S.base); }
  57. //void SS_Length(SqStack S) { printf("Stack length:%ld\n", S.top - S.base); }
  58. void SS_Length(SqStack *S) { printf("Stack length:%ld\n", S->top - S->base); }

  59. Status SS_push(SqStack *S, int e) {
  60.     /*
  61.     int m;
  62.     m = SS_IsFull(*S);
  63.     */
  64.     //int m = SS_IsFull(*S);
  65.     int m = SS_IsFull(S);
  66.     //if(!m) {
  67.     if(m) {
  68.         return false;
  69.     } else {
  70.         *(S->top) = e;
  71.         S->top++;
  72.         return true;
  73.     }
  74. }

  75. Status SS_pop(SqStack *S, int *e) {
  76.     /*
  77.     int m;
  78.     m = SS_IsEmpty(*S);
  79.     */
  80.     //int m = SS_IsEmpty(*S);
  81.     int m = SS_IsEmpty(S);
  82.     //if(!m) {
  83.     if(m) {
  84.         return false;
  85.     } else {
  86.         (S->top)--;
  87.         *e = *(S->top);
  88.     }
  89.     return true;
  90. }

  91. //Status SS_print(SqStack S) {
  92. Status SS_print(SqStack *S) {
  93.     /*
  94.     int m;
  95.     m = SS_IsEmpty(S);
  96.     */
  97.     int m = SS_IsEmpty(S);
  98.     //if(!m) {
  99.     if(m) {
  100.         printf("stack data: Empty!\n");
  101.         return false;
  102.     } else {
  103.         //printf("stack data (from bottom to top):");
  104.         printf("stack data (from top to bottom): ");
  105.         //while(S.top != S.base) {
  106.         while(S->top != S->base) {
  107.             S->top--;
  108.             //printf("%d ", *(S->top));
  109.             printf("%d ", *S->top);
  110.         }
  111.         //printf("%d", S.base);
  112.         //printf("%d", *S.base);
  113.         //printf("%d", *S->base);
  114.     }

  115.     printf("\n");

  116.     return true;
  117. }

  118. int main() {
  119.     SqStack S;
  120.     //int max, b, i = 0;
  121.     //int b, i = 0;
  122.     int b;
  123.     //char ch;
  124.     char a[10];
  125.     /*
  126.     scanf("%d", &max);
  127.     SS_Init(&S, max);
  128.     */
  129.     int temp;
  130.     scanf("%d", &temp);
  131.     SS_Init(&S, 1024);
  132.     while(1) {
  133.         scanf("%s", a);
  134.         /*
  135.         while((ch = getchar()) != ' ') {
  136.             a[i] = ch;
  137.             i++;
  138.         }
  139.         */
  140.         if(strcmp(a, "push") == 0) {
  141.             scanf("%d", &b);
  142.             SS_push(&S, b);
  143.         }
  144.         if(strcmp(a, "pop") == 0) {
  145.             //SS_push(&S, b);
  146.             SS_pop(&S, &b);
  147.         }
  148.         if(strcmp(a, "end") == 0) {
  149.             break;
  150.         }
  151.     }
  152.     //SS_Length(S);
  153.     SS_Length(&S);
  154.     //SS_print(S);
  155.     SS_print(&S);
  156.     stack_deinit(&S);
  157.     return 0;
  158. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-3 21:38:43 | 显示全部楼层
这问题有意思,帮你写了
不过还是建议自己动手写,自己在写的过程中遇到了问题再提问,而不是直接要一个答案,直接看答案对你自己没有什么好处

stack.h
  1. #ifndef _STACK_H_
  2. #define _STACK_H_

  3. #include <stddef.h>
  4. #include <stdbool.h>

  5. typedef int element_t;

  6. struct stack_node_tag {
  7.     element_t data;
  8.     struct stack_node_tag *next;
  9. };

  10. typedef struct {
  11.     struct stack_node_tag *head;
  12.     size_t size;
  13. } stack_t;

  14. stack_t *stack_init(void);
  15. void stack_deinit(stack_t *s);
  16. bool stack_push(stack_t *s, element_t e);
  17. bool stack_pop(stack_t *s, element_t *e);
  18. bool stack_empty(const stack_t *s);
  19. bool stack_size(const stack_t *s, size_t *size);
  20. bool stack_clean(stack_t *s);

  21. #endif
复制代码


stack.c
  1. #include "stack.h"
  2. #include <stdlib.h>

  3. stack_t *stack_init(void) {
  4.     stack_t *s = malloc(sizeof(*s));
  5.     if(!s) return NULL;
  6.     s->head = NULL;
  7.     s->size = 0;
  8.     return s;
  9. }

  10. void stack_deinit(stack_t *s) {
  11.     if(!s) return;
  12.     stack_clean(s); free(s);
  13. }

  14. bool stack_push(stack_t *s, element_t e) {
  15.     if(!s) return false;
  16.     struct stack_node_tag *node = malloc(sizeof(*node));
  17.     if(!node) return false;
  18.     node->data = e;
  19.     node->next = s->head;
  20.     s->head = node;
  21.     ++s->size;
  22.     return true;
  23. }

  24. bool stack_pop(stack_t *s, element_t *e) {
  25.     if(!s) return false;
  26.     struct stack_node_tag *temp = s->head;
  27.     s->head = temp->next;
  28.     if(e) *e = temp->data;
  29.     free(temp); --s->size;
  30.     return true;
  31. }

  32. bool stack_empty(const stack_t *s) {
  33.     if(!s) abort();
  34.     return s->size == 0;
  35. }

  36. bool stack_size(const stack_t *s, size_t *size) {
  37.     if(!s) return false;
  38.     if(!size) return false;
  39.     *size = s->size;
  40.     return true;
  41. }

  42. bool stack_clean(stack_t *s) {
  43.     if(!s) return false;
  44.     while(!stack_empty(s)) stack_pop(s, NULL);
  45.     return true;
  46. }
复制代码


main.c
  1. #include "stack.h"
  2. #include <stdio.h>
  3. #include <string.h>

  4. enum {ERR, PUSH, POP, END};

  5. typedef struct {
  6.     int type;
  7.     int value;
  8. } instruction_t;

  9. instruction_t get_instruction(void) {
  10.     char buff[1024]; scanf("%s", buff);
  11.     instruction_t ins;
  12.     if(!strcmp(buff, "end")) {
  13.         ins.type = END;
  14.     } else if(!strcmp(buff, "push")) {
  15.         ins.type = PUSH;
  16.         scanf("%d", &ins.value);
  17.     } else if(!strcmp(buff, "pop")) {
  18.         ins.type = POP;
  19.     } else ins.type = ERR;
  20.     return ins;
  21. }

  22. void output(stack_t *stack) {
  23.     size_t length; stack_size(stack, &length);
  24.     printf("Stack length: %lu\n", length);
  25.     printf("stack data (from bottom to top): ");
  26.     stack_t *temp = stack_init();
  27.     while(!stack_empty(stack)) {
  28.         int data; stack_pop(stack, &data);
  29.         stack_push(temp, data);
  30.     }
  31.     while(!stack_empty(temp)) {
  32.         int data; stack_pop(temp, &data);
  33.         printf("%d ", data);
  34.     }
  35.     printf("\n");
  36.     stack_deinit(temp);
  37. }

  38. int main(void) {
  39.     int temp; scanf("%d", &temp);   // 完全不需要这个 6
  40.     stack_t *stack = stack_init();
  41.     while(1) {
  42.         instruction_t ins = get_instruction();
  43.         if(ins.type == END) break;
  44.         switch(ins.type) {
  45.             case PUSH: stack_push(stack, ins.value); break;
  46.             case POP: stack_pop(stack, NULL); break;
  47.         }
  48.     }
  49.     output(stack);
  50.     stack_deinit(stack);
  51.     return 0;
  52. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-11-3 21:41:45 | 显示全部楼层
c++ ?

我竟然写代码不看题目要求,还写了半天 stack
我服了,^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-11-3 21:52:03 | 显示全部楼层
人造人 发表于 2021-11-3 21:41
c++ ?

我竟然写代码不看题目要求,还写了半天 stack

那个输入格式是怎么实现的,比如push 65
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 21:52:27 | 显示全部楼层
这题目对于 C语言来说有意思,对于 C++ 来说没意思

  1. #include <iostream>
  2. #include <string>
  3. #include <stack>

  4. enum {ERR, PUSH, POP, END};

  5. typedef struct {
  6.     int type;
  7.     int value;
  8. } instruction_t;

  9. instruction_t get_instruction(void) {
  10.     std::string str; std::cin >> str;
  11.     instruction_t ins;
  12.     if(str == "end") {
  13.         ins.type = END;
  14.     } else if(str == "push") {
  15.         ins.type = PUSH;
  16.         std::cin >> ins.value;
  17.     } else if(str == "pop") {
  18.         ins.type = POP;
  19.     } else ins.type = ERR;
  20.     return ins;
  21. }

  22. int main() {
  23.     {int temp; std::cin >> temp;}
  24.     std::stack<int> stack;
  25.     while(1) {
  26.         instruction_t ins = get_instruction();
  27.         if(ins.type == END) break;
  28.         switch(ins.type) {
  29.             case PUSH: stack.push(ins.value); break;
  30.             case POP: stack.pop(); break;
  31.         }
  32.     }
  33.     size_t length = stack.size();
  34.     printf("Stack length: %lu\n", length);
  35.     printf("stack data (from bottom to top): ");
  36.     std::stack<int> temp;
  37.     while(!stack.empty()) {
  38.         int data = stack.top(); stack.pop();
  39.         temp.push(data);
  40.     }
  41.     while(!temp.empty()) {
  42.         int data = temp.top(); temp.pop();
  43.         std::cout << data << " ";
  44.     }
  45.     std::cout << std::endl;
  46.     return 0;
  47. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 21:53:37 | 显示全部楼层
434773632 发表于 2021-11-3 21:52
那个输入格式是怎么实现的,比如push 65

输入交给 get_instruction 函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-3 21:56:24 | 显示全部楼层
434773632 发表于 2021-11-3 21:52
那个输入格式是怎么实现的,比如push 65

push后面没有回车,直接加空格和数字
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-3 21:57:20 | 显示全部楼层
434773632 发表于 2021-11-3 21:56
push后面没有回车,直接加空格和数字

怎么实现
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 22:02:52 | 显示全部楼层

什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 22:03:22 | 显示全部楼层
  1. #include <iostream>
  2. #include <string>
  3. #include <stack>

  4. enum {ERR, PUSH, POP, END};

  5. typedef struct {
  6.     int type;
  7.     int value;
  8. } instruction_t;

  9. instruction_t get_instruction(void) {
  10.     std::string str; std::cin >> str;
  11.     instruction_t ins;
  12.     if(str == "end") {
  13.         ins.type = END;
  14.     } else if(str == "push") {
  15.         ins.type = PUSH;
  16.         std::cin >> ins.value;
  17.     } else if(str == "pop") {
  18.         ins.type = POP;
  19.     } else ins.type = ERR;
  20.     return ins;
  21. }

  22. int main() {
  23.     {int temp; std::cin >> temp;}
  24.     std::stack<int> stack;
  25.     while(1) {
  26.         instruction_t ins = get_instruction();
  27.         if(ins.type == END) break;
  28.         switch(ins.type) {
  29.             case PUSH: stack.push(ins.value); break;
  30.             case POP: stack.pop(); break;
  31.         }
  32.     }
  33.     std::cout << "Stack length: " << stack.size() << std::endl;
  34.     std::cout << "stack data (from bottom to top): ";
  35.     std::stack<int> temp;
  36.     while(!stack.empty()) {
  37.         int data = stack.top(); stack.pop();
  38.         temp.push(data);
  39.     }
  40.     while(!temp.empty()) {
  41.         int data = temp.top(); temp.pop();
  42.         std::cout << data << " ";
  43.     }
  44.     std::cout << std::endl;
  45.     return 0;
  46. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 22:10:50 | 显示全部楼层
?
究竟是 C语言还是 C++
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-3 22:11:45 | 显示全部楼层

就是你要入栈的话,输入'push 56', push后面不能加回车
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 22:12:35 | 显示全部楼层
后缀 cpp,明显是 C++ 没问题


1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-3 22:12:36 | 显示全部楼层
人造人 发表于 2021-11-3 22:10
?
究竟是 C语言还是 C++

都行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 22:13:40 | 显示全部楼层
434773632 发表于 2021-11-3 22:11
就是你要入栈的话,输入'push 56', push后面不能加回车

对呀,你看我的 get_instruction 函数
这个函数要求加回车了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-3 22:15:03 | 显示全部楼层
人造人 发表于 2021-11-3 22:13
对呀,你看我的 get_instruction 函数
这个函数要求加回车了?

我看不懂c++,我只学过c语言,你把那个函数改成c语言的吧,感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 22:16:35 | 显示全部楼层
434773632 发表于 2021-11-3 22:15
我看不懂c++,我只学过c语言,你把那个函数改成c语言的吧,感谢

给你第 0 次发的代码就是 C语言的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-3 22:16:50 | 显示全部楼层
人造人 发表于 2021-11-3 22:13
对呀,你看我的 get_instruction 函数
这个函数要求加回车了?
  1. #include"stdio.h"
  2. #include"stdlib.h"
  3. #include"string.h"
  4. #define true 1
  5. #define false 0
  6. #define Status int

  7. typedef struct
  8. {
  9.         int *base;
  10.         int *top;
  11.         int stacksize;
  12. }SqStack;

  13. Status SS_Init(SqStack *S, int max);
  14. Status SS_IsFull(SqStack S);
  15. Status SS_IsEmpty(SqStack S);
  16. void SS_Length(SqStack S);
  17. Status SS_push(SqStack *S, int e);
  18. Status SS_pop(SqStack *S, int *e);


  19. Status SS_Init(SqStack *S, int max)
  20. {
  21.         S->base = (int *)malloc(max * sizeof(int));
  22.         if(!(S->base)) exit(1);
  23.         S->top = S->base;
  24.         S->stacksize = max;
  25.         return true;
  26. }

  27. Status SS_IsFull(SqStack S)
  28. {
  29.         if(S.top - S.base == S.stacksize)
  30.         {
  31.                 return true;
  32.         }
  33.         else
  34.         {
  35.                 return false;
  36.         }
  37. }

  38. Status SS_IsEmpty(SqStack S)
  39. {
  40.         if(S.top == S.base)
  41.         {
  42.                 return true;
  43.         }
  44.         else
  45.         {
  46.                 return false;
  47.         }
  48. }

  49. void SS_Length(SqStack S)
  50. {
  51.         printf("Stack length:%d\n", S.top - S.base);
  52. }

  53. Status SS_push(SqStack *S, int e)
  54. {
  55.         int m;
  56.         m = SS_IsFull(*S);
  57.         if(!m)
  58.         {
  59.                 return false;
  60.         }
  61.         else
  62.         {
  63.                 *(S->top) = e;
  64.                 S->top++;
  65.                 return true;
  66.         }
  67. }

  68. Status SS_pop(SqStack *S, int *e)
  69. {
  70.         int m;
  71.         m = SS_IsEmpty(*S);
  72.         if(!m)
  73.         {
  74.                 return false;
  75.         }
  76.         else
  77.         {
  78.                 (S->top)--;
  79.                 *e = *(S->top);
  80.         }
  81. }

  82. Status SS_print(SqStack S)
  83. {
  84.         int m;
  85.         m = SS_IsEmpty(S);
  86.         if(!m)
  87.         {
  88.                 printf("stack data: Empty!\n");
  89.                 return false;
  90.         }
  91.         else
  92.         {
  93.                 printf("stack data (from bottom to top):");
  94.                 while(S.top != S.base)
  95.                 {
  96.                         S.top--;
  97.                         printf("%d ", *(S.top));
  98.                 }
  99.                 printf("%d", S.base);
  100.         }
  101. }

  102. int main()
  103. {
  104.         SqStack S;
  105.         int max, b, i = 0;
  106.         char ch;
  107.         char a[10];
  108.         scanf("%d", &max);
  109.         SS_Init(&S, max);
  110.         while(1)
  111.         {
  112.                 while((ch = getchar()) != ' ')
  113.                 {
  114.                         a[i] = ch;
  115.                         i++;
  116.                 }
  117.                 if(strcmp(a, "push") == 0)
  118.                 {
  119.                         scanf("%d", &b);
  120.                         SS_push(&S, b);
  121.                 }
  122.                 if(strcmp(a, "pop") == 0)
  123.                 {
  124.                         SS_push(&S, b);
  125.                 }
  126.                 if(strcmp(a, "end") == 0)
  127.                 {
  128.                         break;
  129.                 }
  130.         }
  131.         SS_Length(S);
  132.         SS_print(S);
  133.        
  134. }
复制代码

你在我这个基础上改改,改成’push 56‘就入栈的形式
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 22:17:27 | 显示全部楼层
434773632 发表于 2021-11-3 22:15
我看不懂c++,我只学过c语言,你把那个函数改成c语言的吧,感谢
  1. instruction_t get_instruction(void) {
  2.     char buff[1024]; scanf("%s", buff);
  3.     instruction_t ins;
  4.     if(!strcmp(buff, "end")) {
  5.         ins.type = END;
  6.     } else if(!strcmp(buff, "push")) {
  7.         ins.type = PUSH;
  8.         scanf("%d", &ins.value);
  9.     } else if(!strcmp(buff, "pop")) {
  10.         ins.type = POP;
  11.     } else ins.type = ERR;
  12.     return ins;
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 22:21:37 | 显示全部楼层
434773632 发表于 2021-11-3 22:16
你在我这个基础上改改,改成’push 56‘就入栈的形式

我看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-2 07:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表