Description
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
Input
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
Output
求该后缀式所对应的算术表达式的值,并输出之。
Sample
Input
59684/-3+#
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));
if(!s.base)
return -1;
s.top = s.base;
s.stacksize = intsize;
return 0;
}
int 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;
return 0;
}
elemtype pop(Sqstack &s)
{
elemtype x;
return x = *--s.top;
}
void change(Sqstack &s, elemtype 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)
{
printf("%d", pop(s));
}
printf("\n");
}
int main()
{
Sqstack s;
char n;
initstack(s);
while(~scanf("%c", &n) && n != '#')
{
if(n >= '0' && n <= '9')
{
push(s, n - '0');
}
else
{
change(s, n);
}
}
show(s);
return 0;
}
本文介绍了一种使用栈数据结构来解析并计算后缀表达式的算法实现。通过遍历输入的后缀表达式字符串,遇到数字则压入栈中,遇到运算符则从栈中弹出两个数字进行相应的计算并将结果压回栈中,最终栈顶元素即为表达式的计算结果。
1671

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



