鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 434773632

[已解决]C语言栈

[复制链接]
 楼主| 发表于 2021-11-3 22:21:59 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 22:44:02 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-3 22:44:44 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-3 22:46:53 | 显示全部楼层
这是不认真导致的吧?


  1.         if(strcmp(a, "pop") == 0) {
  2.             //SS_push(&S, b);
  3.             SS_pop(&S, &b);
  4.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-4 19:09:11 | 显示全部楼层

屏幕截图 2021-11-04 190309.png 大佬这个是什么意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-4 19:15:58 | 显示全部楼层
434773632 发表于 2021-11-4 19:09
大佬这个是什么意思

拿有道翻译一下

  1. multiple definition of 'main'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-4 19:25:36 | 显示全部楼层

代码在dev上能运行,到这个网站上就这样报错
  1. /*************************************************************
  2.     date: July 2017
  3.     copyright: Zhu En(祝恩)
  4.     DO NOT distribute this code.
  5. **************************************************************/
  6. //顺序存储的栈 实现文件
  7. /////////////////////////////////////////////////////
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>

  11. #define true 1
  12. #define false 0
  13. typedef int T;

  14. struct SeqStack
  15. {
  16.         T* data;
  17.         int top;
  18.         int max;
  19. };

  20. SeqStack* SS_Create(int maxlen);
  21. void SS_Free(SeqStack* ss);
  22. void SS_MakeEmpty(SeqStack* ss);
  23. bool SS_IsFull(SeqStack* ss);
  24. bool SS_IsEmpty(SeqStack* ss);
  25. int SS_Length(SeqStack* ss);
  26. bool SS_Push(SeqStack* ss, T x);
  27. bool SS_Pop(SeqStack* ss, T &item);
  28. void SS_Print(SeqStack* ss);

  29. /*创建一个栈*/
  30. SeqStack* SS_Create(int maxlen)
  31. {
  32.         SeqStack* ss=(SeqStack*)malloc(sizeof(SeqStack));
  33.         ss->data=(T*)malloc(maxlen*sizeof(T));
  34.         ss->top=-1;
  35.         ss->max=maxlen;
  36.         return ss;
  37. }

  38. /*释放一个栈*/
  39. void SS_Free(SeqStack* ss)
  40. {
  41.         free(ss->data);
  42.         free(ss);
  43. }

  44. /*清空一个栈*/
  45. void SS_MakeEmpty(SeqStack* ss)
  46. {
  47.         ss->top=-1;
  48. }

  49. /*判断栈是否为满*/
  50. bool SS_IsFull(SeqStack* ss)
  51. {
  52.         /*请在BEGIN和END之间实现你的代码*/
  53.     /*****BEGIN*****/
  54.     if(ss->top==(ss->max-1))
  55.     {
  56.             return true;
  57.         }
  58.         else
  59.         {
  60.                 return false;
  61.         }

  62.     /******END******/
  63. }

  64. /*判断栈是否为空*/
  65. bool SS_IsEmpty(SeqStack* ss)
  66. {
  67.         /*请在BEGIN和END之间实现你的代码*/
  68.     /*****BEGIN*****/
  69.     if(ss->top==-1)
  70.     {
  71.             return true;
  72.         }
  73.         else
  74.         {
  75.                 return false;
  76.         }

  77.     /******END******/
  78. }

  79. /*获取栈元素个数*/
  80. int SS_Length(SeqStack* ss)
  81. {
  82.         /*请在BEGIN和END之间实现你的代码*/
  83.     /*****BEGIN*****/
  84.     int len = ss->top + 1;
  85.     printf("Stack length:%d\n", len);
  86.     /******END******/
  87. }

  88. /*将x进栈,满栈则无法进栈(返回false)*/
  89. bool SS_Push(SeqStack* ss, T x)
  90. {
  91.         /*请在BEGIN和END之间实现你的代码*/
  92.     /*****BEGIN*****/
  93.     if(SS_IsFull(ss))
  94.     {
  95.             return false;
  96.         }
  97.         else
  98.         {
  99.                 ss->top++;
  100.                 ss->data[ss->top] = x;
  101.         }
  102.     /******END******/
  103. }

  104. /*出栈,出栈的元素放入item,空栈则返回false*/
  105. bool SS_Pop(SeqStack* ss, T &item)
  106. {
  107.         /*请在BEGIN和END之间实现你的代码*/
  108.     /*****BEGIN*****/
  109.     if(SS_IsEmpty(ss))
  110.     {
  111.             return false;
  112.         }
  113.         else
  114.         {
  115.                 item = ss->data[ss->top];
  116.                 ss->top--;
  117.         }
  118.     /******END******/
  119. }

  120. /*获取栈顶元素放入item中,空栈则返回false*/
  121. bool SS_Top(SeqStack* ss, T & item)
  122. {
  123.         if (SS_IsEmpty(ss)) {
  124.                 return false;
  125.         }
  126.         item = ss->data[ss->top];
  127.         return true;
  128. }

  129. /*从栈底到栈顶打印出所有元素*/
  130. void SS_Print(SeqStack* ss)
  131. {
  132.         if (SS_IsEmpty(ss)) {
  133.                 printf("stack data: Empty!\n");
  134.                 return;
  135.         }
  136.         printf("stack data (from bottom to top):");
  137.         int curr=0;
  138.         while(curr<=ss->top) {
  139.                 printf(" %d", ss->data[curr]);
  140.                 curr++;
  141.         }
  142.         //printf("\n");
  143. }

  144. int main()
  145. {
  146.         int max, num, item;
  147.         char a[10];
  148.         SeqStack *ss;
  149.         scanf("%d", &max);
  150.         ss = SS_Create(max);
  151.         while(1)
  152.         {
  153.                 scanf("%s", &a);
  154.                 if(strcmp(a, "push")==0)
  155.                 {
  156.                         scanf("%d", &num);
  157.                         SS_Push(ss, num);
  158.                 }
  159.                 if(strcmp(a, "pop")==0)
  160.                 {
  161.                         SS_Pop(ss, item);
  162.                 }
  163.                 if(strcmp(a, "end")==0)
  164.                 {
  165.                         break;
  166.                 }
  167.         }
  168.         SS_Length(ss);
  169.         SS_Print(ss);
  170.        
  171. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-4 19:30:55 | 显示全部楼层
434773632 发表于 2021-11-4 19:25
代码在dev上能运行,到这个网站上就这样报错

那我就不知道了,报错说 有多个 main 函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-4 19:40:05 | 显示全部楼层
人造人 发表于 2021-11-4 19:30
那我就不知道了,报错说 有多个 main 函数

老师说那个主函数系统给写过了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-4 19:46:44 | 显示全部楼层
434773632 发表于 2021-11-4 19:40
老师说那个主函数系统给写过了

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 18:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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