Problem Description
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
Input
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
Output
求该后缀式所对应的算术表达式的值,并输出之。
Sample Input
59*684/-3*+#
Sample Output
57
Hint
基本操作数都是一位正整数!
#include <stdio.h>
#include <stdlib.h>
#define stackmax 100000 //注意要设置的大一点,防止越界
#define stacknum 100000 //同上
typedef int Elemtype;
typedef struct
{
Elemtype *base;
Elemtype *top;
int stacksize;
}Sqstack;
void Initstack(Sqstack *S)
{
S->base=(Elemtype *)malloc(stackmax*sizeof(Elemtype));
if(!S->base) exit(0);
S->top=S->base;
S->stacksize=stackmax;
}//栈的初始化
void Push(Sqstack *S,int e)
{
if(S->top-S->base>=S->stacksize)
{
S->base=(Elemtype *)realloc(S->base,(S->stacksize+stacknum)*sizeof(Elemtype));
if(!S->base) exit(0);
S->top=S->base+S->stacksize;
S->stacksize=S->stacksize+stacknum;
}
*(S->top)=e;
S->top++;
}//入栈操作
int Pop(Sqstack *S)
{
int e;
e=*(S->top-1);
S->top--;
return e;
}//出栈操作
int GetTop(Sqstack *S)
{
int e;
e=*(S->top-1);
return e;
}//取栈顶元素
void f(Sqstack *S,char n)
{
int a,b;
if(n>='0'&&n<='9') Push(S,n-'0');//判断是不是一个数,要是的话,就把它压入栈中
else if(n=='*')
{
a=Pop(S);
b=Pop(S);
Push(S,a*b);
}
else if(n=='/')
{
a=Pop(S);
b=Pop(S);
Push(S,b/a);
}
else if(n=='+')
{
a=Pop(S);
b=Pop(S);
Push(S,a+b);
}
else if(n=='-')
{
a=Pop(S);
b=Pop(S);
Push(S,b-a);
}//要是是运算符的话,就在栈中弹出两个数据,进行计算后,再压入栈中,'/'和'-‘要注意运算的先后顺序
}
int main()
{
char n;
Sqstack S;
Initstack(&S);
while(scanf("%c",&n)!=EOF)
{
if(n=='#') break;//依次输入所有字符,直到'#'结束
else f(&S,n);
}
int k;
k=GetTop(&S);//取栈顶值赋给k
printf("%d\n",k);//输出k值
return 0;
}