鱼C论坛

 找回密码
 立即注册
查看: 5277|回复: 11

逆波兰计算器(真心求你们给看看,我卡这好几天了)

[复制链接]
发表于 2015-10-16 15:00:09 | 显示全部楼层 |阅读模式
5鱼币
先谢谢你们了! 自己调试了好几天了,应该是‘+’,‘-’号里面出栈有问题,可是实在不知道问题在哪!



                               
登录/注册后可看大图


  1. //用栈来做一个逆波兰计算器

  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>

  5. #define NUMBER 100//栈的最大容量
  6. #define RENUMBER  10//每次动态增容的大小

  7. typedef char ElemType;

  8. typedef struct stack
  9. {
  10.         ElemType *tope;
  11.         ElemType *base;
  12.         int MAXSIZE;//用来存储栈的最大容量
  13. }sqstack;

  14. void initstack(sqstack *s)//初始化栈
  15. {
  16.         s->base = (ElemType *)malloc(sizeof(ElemType) * NUMBER);
  17.         if(!(s->base))
  18.         {
  19.                 return ;
  20.         }
  21.         s->tope = s->base;
  22.         s->MAXSIZE = NUMBER;
  23. }

  24. void push(sqstack *s,int e)//进栈
  25. {
  26.         //如果栈满了,就对栈进行一个动态增容
  27.         if(s->tope - s->base >= s->MAXSIZE)
  28.         {
  29.                 s->base = (ElemType *)realloc(s->base , sizeof(ElemType) * (RENUMBER + NUMBER));
  30.                 if(!s->base)
  31.                 {
  32.                         return;
  33.                 }
  34.                 s->tope = s->base + s->MAXSIZE;
  35.                 s->MAXSIZE = NUMBER + RENUMBER;
  36.         }
  37.         *(s->tope) = e;
  38.         s->tope++;
  39. }


  40. void pop (sqstack *s , int *e)//出栈
  41. {
  42.         if (s->tope == s->base)
  43.         {
  44.                 printf("错误 : 栈已经为空\n");
  45.                 return;
  46.         }
  47.         --(s->tope);
  48.         *e = *(s->tope);

  49. }

  50. void clearstack(sqstack *s)
  51. {
  52.         s->tope = s->base;
  53. }


  54. int main ()
  55. {
  56.         char c;
  57.         int i = 0 ;
  58.         double d = 0 ;double m= 0;
  59.         char temp[10] = {0};
  60.         sqstack s;
  61.         initstack(&s);
  62.         printf("请输入你想要输入的表达式 (数据和运算符之间用空格隔开,输入#表示结束!): \n");
  63.         scanf("%c",&c);
  64.         while (c != '#')
  65.         {
  66.                 while( isdigit(c) || c == '.')//过滤数字
  67.                 {
  68.                         temp[i++] = c;
  69.                         temp[i] = '\0';
  70.                         if( i >= 10)
  71.                         {
  72.                                 printf("出错 : 一次性输入的数据过大!\n");
  73.                                 return -1;
  74.                         }
  75.                         scanf("%c",&c);//这个scanf保证你输入各位以上的数字的时候能
  76.                         if(c == ' ')
  77.                         {
  78.                                 d = atof(temp);
  79.                                 push(&s,d);
  80.                                 i = 0;
  81.                                 break;
  82.                         }
  83.                 }
  84.                 switch (c)
  85.                 {
  86.                 case '+':
  87.                         pop(&s,&m);
  88.                         pop(&s,&d);
  89.                         push(&s,d+m);
  90.                         break;
  91.                 case '-':
  92.                         pop(&s,&m);
  93.                         pop(&s,&d);
  94.                         push(&s,d-m);
  95.                         break;
  96.                 case '*':
  97.                         pop(&s,&m);
  98.                         pop(&s,&d);
  99.                         push(&s,d*m);
  100.                         break;
  101.                 case '/':
  102.                         pop(&s,&m);
  103.                         pop(&s,&d);
  104.                         if(m == 0)
  105.                         {
  106.                                 printf("错误 : 除数不能为零!\n");
  107.                                 return -1;
  108.                         }
  109.                         push(&s,d/m);
  110.                         break;
  111.                 }
  112.                 scanf("%c",&c);

  113.         }
  114.         pop (&s,&d);
  115.         printf("%f",d);
  116.         return 0;

  117. }
复制代码

QQ图片20151016145952.jpg

最佳答案

查看完整内容

我用vs2008 你的代码我黏贴后编译器都通不过,我看了下不是 加号减号的pop问题 是你的pop push 的参数类型不对,你把你一个浮点型的数据压入到int类型里,本身就失去了小数点后面的位数,然后你又把int类型pop成浮点类型,本身逻辑错误,这个不是问题的最关键,最关键是 定义sqstack结构的 成员是 char指针类型, 也就是说你把一个浮点型的数据 push 到一个int类型的变量 然后再试图存入一个char类型指针变量中,我不是高手, 高 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-10-16 15:00:10 | 显示全部楼层
我用vs2008 你的代码我黏贴后编译器都通不过,我看了下不是  加号减号的pop问题 是你的pop push 的参数类型不对,你把你一个浮点型的数据压入到int类型里,本身就失去了小数点后面的位数,然后你又把int类型pop成浮点类型,本身逻辑错误,这个不是问题的最关键,最关键是 定义sqstack结构的 成员是 char指针类型, 也就是说你把一个浮点型的数据 push 到一个int类型的变量 然后再试图存入一个char类型指针变量中,我不是高手, 高手不要笑,我个人认为这个是错误的关键,至于为什么你编译器通过了还运行了 还成出现 一个错误的结果 我也不知道,还要装一个vc6 ,太麻烦,别忘给我鱼币谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-10-17 12:20:17 | 显示全部楼层
y290176346 发表于 2015-10-16 15:00
我用vs2008 你的代码我黏贴后编译器都通不过,我看了下不是  加号减号的pop问题 是你的pop push 的参数类型 ...

真的十分感谢!之前一直丢失数据的警告什么的不注意!以后不会了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-6 11:24:08 | 显示全部楼层
没试过:smile
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-15 17:04:37 | 显示全部楼层
解决了吗?能发下对的代码吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-2-15 18:15:11 | 显示全部楼层
新月传说 发表于 2016-2-15 17:04
解决了吗?能发下对的代码吗?

因为不能上传 .c 文件我把后缀名改成.txt了

jisuanqi.txt

3.81 KB, 下载次数: 48

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-20 18:16:13 | 显示全部楼层
谢谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-24 18:32:16 | 显示全部楼层
mark下,以后看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-29 19:23:08 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-29 19:42:16 | 显示全部楼层
这个是中缀表达式吧sqstack OPND,OPTR;还想问一下这个是干嘛用的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-11 19:14:23 | 显示全部楼层
安静的蓝 发表于 2016-10-29 19:42
这个是中缀表达式吧sqstack OPND,OPTR;还想问一下这个是干嘛用的?

就是小白简单的用栈写的一个计算器而已,要交作业的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-16 08:34:15 | 显示全部楼层
循环那里一个push函数调用没加取地址符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 17:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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