用栈链实现逆波兰计算法
代码如下:#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef char LX;
typedef struct StackNode
{
LX data;
struct StackNode *next;
}StackNode,*LinkStackptr;
typedef struct
{
LinkStackptr top;
int count;
}LinkStack;
void push(LinkStack *s,LX x)
{
StackNode *p;
p=(StackNode *)malloc(sizeof(StackNode)); //调试的时候这里有问题
p->data=x;
p->next=s->top;
s->top=p;
s->count++;
}
void pop(LinkStack *s,LX *x)
{
LinkStackptr p;
*x=s->top->data;
p=s->top;
s->top=p->next;
free(p);
s->count--;
}
int main()
{
LinkStack s,*p;
int i,len;
LX x;
double a,b,res;
LX str;
p=&s;
p=(LinkStack *)malloc(sizeof(LinkStack));
s.count=0;
printf("请输入一个逆波兰表达式(以'#'结尾): ");
scanf("%c",&x);
while(x!='#')
{
while(isdigit(x) || x=='.') //判断输入是否为数字或'.'(小数点)。
{
str=x;
str='\0';
if(i>=10)
{
printf("输入的数据个数过多!");
}
scanf("%c",&x);
if(x==' ')
{
a=atof(str);
push(&s,a);
i=0;
break;
}
}
switch(x)
{
case '+':
pop(&s,&b);
pop(&s,&a);
push(&s,a+b);
break;
case '-':
pop(&s,&b);
pop(&s,&a);
push(&s,a-b);
break;
case '*':
pop(&s,&b);
pop(&s,&a);
push(&s,a*b);
break;
case '/':
pop(&s,&b);
pop(&s,&a);
if(b==0)
{
printf("输入有误,除数不能为0 \n");
}
else
push(&s,a/b);
break;
}
scanf("%c",&x);
}
//从缓冲区去除'\n'
pop(&s,&res);
printf("运算的结果为: %f\n",res);
return 0;
}
程序可以打开当时输入后按回车就报错!!!求大神指点!!!!!
你的代码真的很烂,不是说质量,说的是风格,代码应该条理分明,这是提问最起码的态度!本来真心不想帮你改代码。#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef char LX;
typedef struct StackNode
{
LX data;
struct StackNode *next;
}StackNode,*LinkStackptr;
typedef struct
{
LinkStackptr top;
int count;
}LinkStack;
void push( LinkStack *s , LX x )
{
StackNode *p;
p=(StackNode *)malloc(sizeof(StackNode)); //调试的时候这里有问题
if( p == NULL )
{
perror("push():");
}
p->data=x;
p->next=s->top;
s->top=p;
s->count++;
}
void pop(LinkStack *s,int *x)
{
LinkStackptr p;
*x = s->top->data - '0';
p=s->top;
s->top=p->next;
free(p);
s->count--;
}
int main()
{
LinkStack *s;
int i = 0, len;
LX x;
int a,b,res;
LX str;
s=(LinkStack *)malloc(sizeof(LinkStack));
s->count=0;
s->top = NULL;
printf("input:");
scanf("%c",&x);
while( x!='#' )
{
if( isdigit(x) ) //判断输入是否为数字或'.'(小数点)。
{
if( i >= 9 )
{
printf("too much!\n");
break;
}
str=x;
push( s , x );
}
switch( x )
{
case '+':
pop(s,&b);
pop(s,&a);
push(s,(a+b) + '0');
break;
case '-':
pop(s,&b);
pop(s,&a);
push(s,(a-b) + '0');
break;
case '*':
pop(s,&b);
pop(s,&a);
push(s,(a*b) + '0');
break;
case '/':
pop(s,&b);
pop(s,&a);
if(b==0)
{
printf("输入有误,除数不能为0 \n");
}
else
push(s,(a/b) + '0');
break;
}
scanf("%c",&x);
}
pop(s,&res);
printf("answer is:%d\n",res);
return 0;
}
谭斌谭斌 发表于 2014-3-8 23:19 static/image/common/back.gif
你的代码真的很烂,不是说质量,说的是风格,代码应该条理分明,这是提问最起码的态度!本来真心不想帮你改 ...
首先感谢你回答我的问题,其次这代码纯属黏贴复制只是放上论坛没有修正排版,很抱歉(正常人能这样写代码吗,用脚趾头想想就知道了= =),最后我想说这代码你试过了吗,成功了吗,我试了虽然没报错但是没有输出啊!!! 编辑器:Notepad,编译器:gcc 本帖最后由 sidfate 于 2014-3-9 13:54 编辑
谭斌谭斌 发表于 2014-3-9 13:03 http://bbs.fishc.com/static/image/common/back.gif
编辑器:Notepad,编译器:gcc
发现问题(输出结果是个异常数)所在于这段代码:
while(isdigit(x) || x=='.') //判断输入是否为数字或'.'(小数点)。
{
str=x;
str='\0';
if(i>=10)
{
printf("输入的数据个数过多!");
return -1;
}
scanf("%c",&x);
if(x==' ')
{
c=atof(str);
push(s,c);
i=0;
break;
}
}
这是小甲鱼老师上课给的代码,为什么用在这里会出错,用您的代码结果正确??
问题不是代码,是思路,那个视频我没看过,他的思路我不清楚,你可以先看看我的代码,看懂了估计发现上段代码错误不会是难事……如果代码有疑问可以告诉我,我会加上注释。 sidfate 发表于 2014-3-9 13:40
发现问题(输出结果是个异常数)所在于这段代码:
小甲鱼老师的代码是 输入完全符合 逆波兰表达式规则的
而你的输入没有符合逆波兰表达式规则 谭斌谭斌 发表于 2014-3-8 18:31
你的代码真的很烂,不是说质量,说的是风格,代码应该条理分明,这是提问最起码的态度!本来真心不想帮你改 ...
请问你的代码怎么判断小数的
我怎么感觉你的代码只能针对0~9 的数字进行计算啊??? 谭斌谭斌 发表于 2014-3-8 18:31
你的代码真的很烂,不是说质量,说的是风格,代码应该条理分明,这是提问最起码的态度!本来真心不想帮你改 ...
我怎么感觉你的代码只能针对0~9 之间的数字进行计算啊????? LZ你的i没有初始化,补上i=0;
页:
[1]