题目描述
后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *。利用栈结构,将后缀表达式的结果计算出来。
输入
后缀表达式。以#号作为表达式结束标志。为了简单,处理的数据为0-9的整数。
输出
计算结果。
样例输入
3 6 6 2 / - 3 * +#
样例输出
12
#include<stdio.h>
#define MaxSize 1000
//顺序栈
typedef struct st
{
int data[MaxSize];
int top;
}SqStack;
void init(SqStack*&s)
{
s=new SqStack;
s->top=-1;
}
void push(SqStack*&s,int e)
{
if(s->top==MaxSize-1) return ;
s->top++;
s->data[s->top]=e;
}
int pop(SqStack*&s)
{
int e;
if(s->top==-1) return 0;
e=s->data[s->top];
s->top--;
return e;
}
int main()
{
SqStack*st;
init(st);
int e;
char data;
//遇到数字则进栈
//遇到操作符则出栈两个数字
//先出栈的在操作符右边
//后出栈的在才操作符左边
while(scanf("%c",&data)!=EOF)
{
if(data=='#')//退出
{
break;
}
if(data==' ')//如果是空格,则不管
continue;
if(data>='0'&&data<='9')//数字进栈
{
push(st,data-'0');
}else//操作符出栈
{
int b=pop(st);
int a=pop(st);
switch(data)
{
case '+':
push(st,a+b);
break;
case '-':
push(st,a-b);
break;
case '*':
push(st,a*b);
break;
case '/':
push(st,a/b);
break;
}
}
}
//最终栈顶元素就是答案
printf("%d",pop(st));
}