数据结构实验之栈三:后缀式求值
Time Limit: 1000MS Memory limit: 65536K
题目描述
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
输入
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
输出
求该后缀式所对应的算术表达式的值,并输出之。
示例输入
59*684/-3*+#
示例输出
57
提示
在字符串中,如果是数字,则进栈,如果是运算符则将栈中的前两个元素进行计算,然后删除栈中的前两个元素,并将新的计算结果入栈,全部完成后,出栈!
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define maxstack 1000//栈的初始存储空间
#define maxadd 100//栈的每次分配的增量
typedef int Elemtype;
typedef struct
{
Elemtype *top;//栈顶
Elemtype *base;//栈底
int stacksize;//栈大小
}qstack;
//初始化栈
int Initstack(qstack &s)
{
s.base=(Elemtype *)malloc(maxstack*sizeof(Elemtype));
if(!s.base)
{
exit(0);
}
s.top=s.base;
s.stacksize=maxstack;
return 0;
}
//进栈
int Pushstack(qstack &s,char e)
{
if(s.top-s.base>=s.stacksize)//栈满,追加开辟存储空间
{
s.base=(Elemtype *)realloc(s.base,(maxstack+maxadd)*sizeof(Elemtype));
if(!s.base)
{
exit(0);
}
s.top=s.base+maxstack;
}
if(e>='0'&&e<='9')
{
*s.top++=(e-'0');//将字符型转化成整型
}
else if(e=='+'||e=='-'||e=='*'||e=='/')//对栈的前两个数字进行运算
{
if(e=='+')
{
int t,t1,t2;
t=0;
t1=*(s.top-1);
*(s.top--);
t2=*(s.top-1);//注意:这个地方是减1而不是减2!
*(s.top--);
t=t1+t2;
*(s.top++)=t;
}
else if(e=='-')
{
int t,t1,t2;
t=0;
t1=*(s.top-1);
*(s.top--);
t2=*(s.top-1);
*(s.top--);
if(t1>=t2)
{
t=t1-t2;
}
else
{
t=t2-t1;
}
*(s.top++)=t;
}
else if(e=='*')
{
int t,t1,t2;
t=0;
t1=*(s.top-1);
*(s.top--);
t2=*(s.top-1);
*(s.top--);
t=t1*t2;
*(s.top++)=t;
}
else if(e=='/')
{
int t,t1,t2;
t=0;
t1=*(s.top-1);
*(s.top--);
t2=*(s.top-1);
*(s.top--);
if(t1>=t2)
{
t=t1/t2;
}
else
{
t=t2/t1;
}
*(s.top++)=t;
}
}
return 0;
}
//出栈
void Putstack(qstack &s)
{
while(s.top>s.base)
{
printf("%d",*(--s.top));
}
}
int main()
{
char a[1000];
qstack s;
Initstack(s);//初始化栈
for(int i=0; ;i++)
{
scanf("%c",&a[i]);
if(a[i]=='#')
break;
Pushstack(s,a[i]);//进栈
}
Putstack(s);//出栈
return 0;
}