数据结构实验之栈与队列三:后缀式求值
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
Input
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
Output
求该后缀式所对应的算术表达式的值,并输出之。
Example Input
59*684/-3*+#
Example Output
57
Hint
基本操作数都是一位正整数!
#include <bits/stdc++.h>
using namespace std;
#define intsize 100000
#define addsize 100000
typedef int elemtype;
typedef struct
{
elemtype *base;
elemtype *top;
int stacksize;
}sqstack;
int initstack(sqstack &s)
{
//s.base = (elemtype *)malloc(intsize*sizeof(elemtype));
s.base = new elemtype[intsize];
if(!s.base) return -1;
s.top = s.base;
s.stacksize = intsize;
return 0;
}
void push(sqstack &s, elemtype x)
{
/*if(s.top-s.base > s.stacksize)//栈满,追加存储空间
{
s.base = new elemtype[intsize+addsize];
if(!s.base) return -1;
s.top = s.base + addsize;
s.stacksize += addsize;
}*/
*s.top++ = x;
}
int pop(sqstack &s)
{
elemtype x;
return x = *--s.top;
}
void change(sqstack &s,char n)
{
int e1,e2;
if(n=='+')
{
e1 = pop(s);
e2 = pop(s);
push(s,e1+e2);
}
else if(n=='-')
{
e1 = pop(s);
e2 = pop(s);
push(s,e2-e1);
}
else if(n=='*')
{
e1 = pop(s);
e2 = pop(s);
push(s,e1*e2);
}
else if(n=='/')
{
e1 = pop(s);
e2 = pop(s);
push(s,e2/e1);
}
}
void show(sqstack &s)
{
while(s.top!=s.base)
{
cout << pop(s);
}
cout << endl;
}
int main()
{
sqstack s;
char x;
initstack(s);
while(~scanf("%c",&x)&&x!='#')
{
if(x>='0' && x<='9')
{
push(s,x-'0');
}
else
{
change(s,x);
}
}
show(s);
return 0;
}