Problem Description
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
Input
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
Output
求该后缀式所对应的算术表达式的值,并输出之。
Example Input
59*684/-3*+#
Example Output
57
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define stackmax 10000
#define stacknum 10000
typedef int element;
typedef struct
{
element *base;
element *top;
int stacksize;
}sqstack;
int initstack(sqstack &S)
{
S.base = (element *)malloc(stackmax *sizeof(element));
if(!S.base) exit(0);
S.top = S.base;
S.stacksize = stackmax;
return 0;
}
void push(sqstack &S, int e)
{
if(S.top - S.base > S.stacksize)
{
S.base = (element *)realloc(S.base,(S.stacksize + stacknum) *sizeof(element));
S.top = S.base + S.stacksize;
S.stacksize += stacknum;
}
*S.top = e;
S.top++;
}
int pop(sqstack &S,int e)
{
if(S.base != S.top)
{
e = *(S.top-1);
S.top--;
}
else
{
return 0;
}
return e;
}
int main()
{
sqstack S;
initstack(S);
int e1, e2;
char c;
while(~scanf("%c", &c))
{
if(c == '#')
{
break;
}
if(c >= '0' && c <= '9')
{
push(S, c - '0');
}
else
{
if(c == '+')
{
e1 = pop(S, e1);
e2 = pop(S, e2);
push(S, e1+e2);
}
else if(c == '-')
{
e1 = pop(S, e1);
e2 = pop(S, e2);
push(S, e2-e1);
}
else if(c == '*')
{
e1 = pop(S, e1);
e2 = pop(S, e2);
push(S, e2*e1);
}
else if(c == '/')
{
e1 = pop(S, e1);
e2 = pop(S, e2);
push(S, e2/e1);
}
}
}
printf("%d\n", *(S.top-1));
return 0;
}

本文介绍了一种使用栈数据结构来解析和计算后缀表达式的算法实现。通过逐步读取输入字符并根据字符类型进行相应的操作,最终得出后缀表达式的计算结果。
1063

被折叠的 条评论
为什么被折叠?



