鱼C论坛

 找回密码
 立即注册
查看: 1078|回复: 2

[已解决]求助

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

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

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

x
本帖最后由 三刀流.索隆 于 2021-9-19 13:31 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>

  4. #define STACK_INIT_SIZE 20
  5. #define STACKINCREMENT 10
  6. #define MAXBUFFER       10

  7. typedef char ElemType;
  8. typedef struct
  9. {
  10.         ElemType *base;
  11.         ElemType *top;
  12.         int stackSize;
  13. }sqStack;

  14. //初始化栈
  15. void InitStack(sqStack *s)
  16. {
  17.         s->base = s->top = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
  18.         if(!s->base)
  19.                 exit(0);
  20.         s->stackSize = STACK_INIT_SIZE;
  21. }

  22. //入栈
  23. void Push(sqStack *s,ElemType e)
  24. {
  25.         if (s->top-s->base == s->stackSize)
  26.         {
  27.                 s->base = (ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT) * sizeof(ElemType));
  28.                 if (!s->base)
  29.                         exit(0);
  30.         s->stackSize = s->stackSize + STACKINCREMENT;
  31.         }
  32.         *s->top = e;
  33.         s->top++;
  34. }

  35. //出栈
  36. void Pop(sqStack *s,ElemType *e)
  37. {
  38.         if(s->top == s->base)
  39.                 return;
  40.         *e = *--(s->top);
  41. }

  42. //计算栈的容量
  43. int StackLen(sqStack s)
  44. {
  45.         return(s.top - s.base);
  46. }

  47. int main(void)
  48. {
  49.         sqStack s;
  50.         char c,e;

  51.         InitStack(&s);
  52.        
  53.         printf("请输入中罪表达式,#表示结束:");
  54.         scanf("%c",&c);

  55.         while (c != '#')
  56.         {
  57.                 while (c >= '0' && c <= '9')
  58.                 {
  59.                         if ( c >= '0' && c <= '9')
  60.                         {
  61.                                 printf("%c",c);
  62.                         }
  63.                         scanf("%c",&c);
  64.                         if (c < '0' || c > '9')
  65.                                 printf(" ");
  66.                 }
  67.                 if (c == ')')
  68.                 {
  69.                         Pop(&s,&e);
  70.                         while ('(' != e)
  71.                         {
  72.                                 printf("%c",e);
  73.                                 Pop(&s,&e);
  74.                         }
  75.                 }

  76.                 else if ('+'==c || '-'==c)
  77.                 {
  78.                         if ( !StackLen(s))
  79.                                 Push(&s,c);
  80.                         else
  81.                         {
  82.                                 do
  83.                                 {
  84.                                         Pop(&s,&e);
  85.                                         if ('(' == e)
  86.                                         {
  87.                                                 Push(&s,e);
  88.                                                 break;
  89.                                         }
  90.                                         else
  91.                                         {
  92.                                                 printf("%c",e);
  93.                                         }
  94.                                 }while ( StackLen(s) && '(' != e);
  95.                                 Push(&s,c);
  96.                         }
  97.                 }
  98.                 else if ('*'==c || '/'==c)
  99.                 {
  100.                         Push(&s,c);
  101.                 }
  102.                 else
  103.                 {
  104.                         if ('#' != c)
  105.                                 printf("\n错误,输入格式有误!");
  106.                 }
  107.                 scanf("%c",&c);
  108.         }


  109.         while (StackLen(s))
  110.         {
  111.                      Pop(&s,&e);
  112.                      printf("%c",e);
  113.         }
  114.        
  115.         printf("\n");

  116.      return 0;
  117. }
复制代码

运行起来输入1+(2-3)*4+10/5#程序会进入死循环

最佳答案
2021-9-20 21:04:09
本帖最后由 jhq999 于 2021-9-20 21:08 编辑

你里面是不是缺一个这个判断
  1. if ('(' == c)
复制代码
  1. if (c == ')')
  2.                 {
  3.                         Pop(&s,&e);
  4.                         while ('(' != e)//你'('都没压入栈,怎么弹出'('
  5.                         {
  6.                                 printf("%c",e);
  7.                                 Pop(&s,&e);
  8.                         }
  9.                 }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-20 21:04:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2021-9-20 21:08 编辑

你里面是不是缺一个这个判断
  1. if ('(' == c)
复制代码
  1. if (c == ')')
  2.                 {
  3.                         Pop(&s,&e);
  4.                         while ('(' != e)//你'('都没压入栈,怎么弹出'('
  5.                         {
  6.                                 printf("%c",e);
  7.                                 Pop(&s,&e);
  8.                         }
  9.                 }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 22:12:18 | 显示全部楼层
jhq999 发表于 2021-9-20 21:04
你里面是不是缺一个这个判断

是哦
  1.                 else if ('*'==c || '/'==c)//改成else if('*'==c || '/'==c || '('==c)就行了应该
  2.                 {
  3.                         Push(&s,c);
  4.                 }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 05:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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