数据结构实验之栈与队列三:后缀式求值
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
Input
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
Output
求该后缀式所对应的算术表达式的值,并输出之。
Example Input
59*684/-3*+#
Example Output
57
Hint
基本操作数都是一位正整数!
代码如下:
#include<bits/stdc++.h>
typedef int elemtype;
typedef int status;
#define MAXSIZE 100
#define true 1
#define false 0
typedef struct
{
elemtype *base;
elemtype *top;
int stacksize;
} Sqstack;
status isEmpty(Sqstack &S)
{
if(S.top == S.base)
return true;
else
return false;
}
void initStack(Sqstack &S)
{
S.base = new elemtype[MAXSIZE];
S.top = S.base;
S.stacksize = MAXSIZE;
}
elemtype getTop(Sqstack &S)
{
if(S.base == S.top)
return false;
else
return *(S.top-1);
}
void Push(Sqstack &S, elemtype e) //压栈
{
if(S.top-S.base >= S.stacksize)
{
S.base = (elemtype *)realloc(S.base,(MAXSIZE+S.stacksize)*sizeof(elemtype));
S.top = S.base + S.stacksize;
S.stacksize += MAXSIZE;
}
*S.top++ = e;
}
int Pop(Sqstack &S, elemtype &e)
{
if(S.top == S.base) return false;
return e = * --S.top;
}
int main()
{
Sqstack S;
initStack(S);
char str[100];
scanf("%s", str);
for(int i = 0; str[i] != '#'; i++)
{
if(str[i]>='0' && str[i] <= '9')
{
Push(S, str[i]-'0');
}
else if(str[i] == '*')
{
int a, b;
Pop(S, a);
Pop(S, b);
Push(S, a*b);
}
else if(str[i] == '/')
{
int a, b;
Pop(S, a);
Pop(S, b);
Push(S, b/a);
}
else if(str[i] == '+')
{
int a, b;
Pop(S, a);
Pop(S, b);
Push(S, a+b);
}
else if(str[i] == '-')
{
int a, b;
Pop(S, a);
Pop(S, b);
Push(S, b-a);
}
}
printf("%d\n", getTop(S));
return 0;
}