数据结构实验之栈与队列三:后缀式求值
Time Limit: 1000 ms Memory Limit: 65536 KiB
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
Input
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
Output
求该后缀式所对应的算术表达式的值,并输出之。
Sample Input
59684/-3+#
Sample Output
57
Hint
基本操作数都是一位正整数!.
/*******
后缀式求值:只需让数字进栈即可,运算符不用进栈,碰见运算符直接计算即可。
*******/
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define max 10000
typedef int elemtype;
typedef struct st
{
elemtype*base,*top;
int sqstacklize;
}sqstack;
void creat(sqstack*s)
{
s->base=(elemtype*)malloc(max*sizeof(elemtype));
s->top=s->base;
s->sqstacklize=max;
}
void push(sqstack *s,elemtype e)
{
*s->top++=e;
}
void pop(sqstack*s,elemtype &e)
{
e=*--s->top;
}
int main()
{
char l[1000];
sqstack s;
creat(&s);
scanf("%s",l);
int e1,e2;
for(int i=0;l[i]!='#';i++)
{
if(l[i] >= '0'&&l[i] <= '9')
push(&s,l[i]-'0'); //注意要减去'0',将字符型转换成整型
else
if(l[i] == '+')
{
pop(&s,e1);
pop(&s,e2);
push(&s,e1+e2);
}
else
if(l[i] == '-')
{
pop(&s,e1);
pop(&s,e2);
push(&s,e2-e1); //先进后出,e2后出在前面
}
else
if(l[i]== '*')
{
pop(&s,e1);
pop(&s,e2);
push(&s,e1*e2);
}
else
if(l[i] == '/')
{
pop(&s,e1);
pop(&s,e2);
push(&s,e2/e1);
}
}
int e;
pop(&s,e);
printf("%d\n",e);
return 0;
}