主题:菜鸟求教(关于栈)
fenixlee520
[专家分:0] 发布于 2006-11-26 21:18:00
设计一个算术四则运算表达式求值的简单计算器。(提示:使用链表或数组实现一个栈,根据运算符的优先级,将算术表达式转换成后缀表达式进行计算。)
虽然学过了栈的知识,但是只是纸上谈兵.看见这道题根本无从下手,很是无奈.
因为专业关系平时编程不是很多,还望哪位高手给指点一下.给个伪码或是原代更好.谢谢大家了.
按照要求,计算A+B*C,应该是让ABC成为一个栈,(我觉得C为栈顶),ABC*+就表示A+B*C运算.可以看出先算B*C,应该把这个值赋给栈顶吧.再算A+B*C.
谢谢大家指点了!
回复列表 (共6个回复)
沙发
liuzyn [专家分:560] 发布于 2006-11-26 22:32:00
参考16届编程比赛。
板凳
fenixlee520 [专家分:0] 发布于 2006-11-27 12:47:00
没有找到啊```
3 楼
argentmoon [专家分:13260] 发布于 2006-11-27 15:51:00
搜索波兰表达式,会有帮助的。
4 楼
ZackChen [专家分:50] 发布于 2006-11-27 17:06:00
这个是算数表达式求值的源代码,也许对你有用,作者是大象踩蚂蚁,帖子是本网站的,有些问题自己可以找到答案的,到网上搜一下
#include<stdlib.h>
#include<stdio.h>
#define stack_init_size1 40
#define stack_init_size2 20
#define stackincrement1 40
#define stackincrement2 20
typedef struct{
int *base;
int *top;
int stacksize;
}s_stack;
typedef struct{
char *base;
char *top;
int stacksize;
}f_stack;
static char youxian[7][7]=
{
{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','>'},{'>','>','>','>','>','>','>'},
{'<','<','<','<','<','>','='}
};
int in(char c)
{
switch(c)
{
case '+': return 0;
case '-': return 1;
case '*': return 2;
case '/': return 3;
case '(': return 4;
case ')': return 5;
case '#':return 6;
default:return 9;
}
}
void s_push(s_stack *s,int e)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(int *)realloc(s->base,(s->stacksize+stackincrement1)*sizeof(int));
if(!s->base) exit(0);
s->top=s->base+s->stacksize;
s->stacksize+=stackincrement1;
}
*s->top=e; s->top++;
/*printf("the s_stack has the data:%d\n",*(s->top-1));*/
}
void f_push(f_stack *f,char e)
{
if(f->top-f->base>=f->stacksize)
{
f->base=(char *)realloc(f->base,(f->stacksize+stackincrement2)*sizeof(char));
if(!f->base) exit (0);
f->top=f->base+f->stacksize;
f->stacksize+=stackincrement2;
}
*f->top=e;f->top++;
/* printf("the f_stack has the sign:%c\n",*(f->top-1));*/
}
int s_gettop(s_stack *s)
{
s->top--;
return *s->top;
}
char f_gettop(f_stack *f)
{
f->top--;
return *f->top;
}
char pduan(f_stack *f,char c)
{
int m,n;
char w;
m=in(c);
w=*(f->top-1);
n=in(w);
return youxian[n][m];
}
int yunsuan(int p,char r,int q)
{
switch(r)
{
case '+': return q+p;
case '-': return q-p;
case '*': return q*p;
case '/': return q/p;
}
}
5 楼
ZackChen [专家分:50] 发布于 2006-11-27 17:07:00
int main()
{
int h=0,jieguo,wrong;
char c;
s_stack s;
f_stack f;
s.base=(int*)malloc(stack_init_size1*sizeof(int));
if(!s.base) return 0;
s.top=s.base;
s.stacksize=stack_init_size1;
f.base=(char*)malloc(stack_init_size2*sizeof(char));
if(!f.base) return 0;
f.top=f.base;
f.stacksize=stack_init_size2;
*f.top='#';f.top++;
printf("please press the sizi end by enter!");
c=getchar();
while(c!='\n')
{ int t;
int p,q;
char r;
if(in(c)==9)
{ if(h>0)
{
t=s_gettop(&s);
s_push(&s,t*10+c-48);
}
else s_push(&s,c-48);
h++;c=getchar();
}
else
switch(pduan(&f,c))
{
case '<':
f_push(&f,c);c=getchar();h=0;break;
case '=':
f.top--;
f.stacksize--;
c=getchar();h=0;break;
case '>':
p=s_gettop(&s);
q=s_gettop(&s);
r=f_gettop(&f);
if(r=='/'&&p==0)
{wrong=1;break;}
else
{ jieguo=yunsuan(p,r,q);
s_push(&s,jieguo);h=0;break;
}
}
}
while((c=='\n')&&(*(f.top-1)!='#'))
{
int p,q;
char r;
p=s_gettop(&s);
q=s_gettop(&s);
r=f_gettop(&f);
if(r=='/'&&p==0)
{wrong=1;break;}
else
jieguo=yunsuan(p,r,q);
s_push(&s,jieguo);
}
if(wrong==1)
printf("It is wrong!\n");
else
printf("the answer is %d\n",s_gettop(&s));
}
6 楼
fenixlee520 [专家分:0] 发布于 2006-11-28 10:15:00
谢谢 不过我用的是vc6.0 有些东西和c语言不太一样 我自己再试试吧 如果有人能发个c++版的更加感谢了
我来回复