逆波兰计算器(真心求你们给看看,我卡这好几天了)
先谢谢你们了! 自己调试了好几天了,应该是‘+’,‘-’号里面出栈有问题,可是实在不知道问题在哪!static/image/hrline/line6.png
//用栈来做一个逆波兰计算器
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define NUMBER 100//栈的最大容量
#define RENUMBER10//每次动态增容的大小
typedef char ElemType;
typedef struct stack
{
ElemType *tope;
ElemType *base;
int MAXSIZE;//用来存储栈的最大容量
}sqstack;
void initstack(sqstack *s)//初始化栈
{
s->base = (ElemType *)malloc(sizeof(ElemType) * NUMBER);
if(!(s->base))
{
return ;
}
s->tope = s->base;
s->MAXSIZE = NUMBER;
}
void push(sqstack *s,int e)//进栈
{
//如果栈满了,就对栈进行一个动态增容
if(s->tope - s->base >= s->MAXSIZE)
{
s->base = (ElemType *)realloc(s->base , sizeof(ElemType) * (RENUMBER + NUMBER));
if(!s->base)
{
return;
}
s->tope = s->base + s->MAXSIZE;
s->MAXSIZE = NUMBER + RENUMBER;
}
*(s->tope) = e;
s->tope++;
}
void pop (sqstack *s , int *e)//出栈
{
if (s->tope == s->base)
{
printf("错误 : 栈已经为空\n");
return;
}
--(s->tope);
*e = *(s->tope);
}
void clearstack(sqstack *s)
{
s->tope = s->base;
}
int main ()
{
char c;
int i = 0 ;
double d = 0 ;double m= 0;
char temp = {0};
sqstack s;
initstack(&s);
printf("请输入你想要输入的表达式 (数据和运算符之间用空格隔开,输入#表示结束!): \n");
scanf("%c",&c);
while (c != '#')
{
while( isdigit(c) || c == '.')//过滤数字
{
temp = c;
temp = '\0';
if( i >= 10)
{
printf("出错 : 一次性输入的数据过大!\n");
return -1;
}
scanf("%c",&c);//这个scanf保证你输入各位以上的数字的时候能
if(c == ' ')
{
d = atof(temp);
push(&s,d);
i = 0;
break;
}
}
switch (c)
{
case '+':
pop(&s,&m);
pop(&s,&d);
push(&s,d+m);
break;
case '-':
pop(&s,&m);
pop(&s,&d);
push(&s,d-m);
break;
case '*':
pop(&s,&m);
pop(&s,&d);
push(&s,d*m);
break;
case '/':
pop(&s,&m);
pop(&s,&d);
if(m == 0)
{
printf("错误 : 除数不能为零!\n");
return -1;
}
push(&s,d/m);
break;
}
scanf("%c",&c);
}
pop (&s,&d);
printf("%f",d);
return 0;
}
我用vs2008 你的代码我黏贴后编译器都通不过,我看了下不是加号减号的pop问题 是你的pop push 的参数类型不对,你把你一个浮点型的数据压入到int类型里,本身就失去了小数点后面的位数,然后你又把int类型pop成浮点类型,本身逻辑错误,这个不是问题的最关键,最关键是 定义sqstack结构的 成员是 char指针类型, 也就是说你把一个浮点型的数据 push 到一个int类型的变量 然后再试图存入一个char类型指针变量中,我不是高手, 高手不要笑,我个人认为这个是错误的关键,至于为什么你编译器通过了还运行了 还成出现 一个错误的结果 我也不知道,还要装一个vc6 ,太麻烦,别忘给我鱼币谢谢 y290176346 发表于 2015-10-16 15:00
我用vs2008 你的代码我黏贴后编译器都通不过,我看了下不是加号减号的pop问题 是你的pop push 的参数类型 ...
真的十分感谢!之前一直丢失数据的警告什么的不注意!以后不会了! 没试过:smile 解决了吗?能发下对的代码吗? 新月传说 发表于 2016-2-15 17:04
解决了吗?能发下对的代码吗?
因为不能上传 .c 文件我把后缀名改成.txt了 谢谢分享! mark下,以后看 谢谢分享 这个是中缀表达式吧sqstack OPND,OPTR;还想问一下这个是干嘛用的? 安静的蓝 发表于 2016-10-29 19:42
这个是中缀表达式吧sqstack OPND,OPTR;还想问一下这个是干嘛用的?
就是小白简单的用栈写的一个计算器而已,要交作业的 循环那里一个push函数调用没加取地址符
页:
[1]