【问题描述】
从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(-)、乘(*)、除(/)四种运算符。
每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。
以@作为结束标志。
【算法分析】
后缀表达式的处理过程很简单,过程如下:
扫描后缀表达式,凡遇操作数则将之压进堆栈,与运算符则从堆栈中弹出两个操作数进行该运算,将运算结果压栈,然后继续扫描,直到后缀表达式被扫描完毕为止,此时栈底元素即为该后缀表达式的值。
代码分析
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
int stack[101];
char s[256];
int comp(char s[256])
{
int i=0,top=0,x,y;
while(i<=strlen(s)-2)
{
switch(s[i])
{
case '+':
stack[--top]+=stack[top+1];break;
case '-':
stack[--top]-=stack[top+1];break;
case '*':
stack[--top]*=stack[top+1];break;
case '/':
stack[--top]/=stack[top+1];break;
default:
x=0;
while(s[i]!=' ')
x=x*10+s[i++]-'0';
stack[++top]=x;
break;
}
i++;
}
return stack[top];
}
int main ()
{
printf("input a string (@_over):");
gets(s);
printf("result=%d",comp(s));
return 0;
}
例题
【例1】后缀表达式的值
时间限制: 10 ms 内存限制: 65536 KB
提交数: 6618 通过数: 992
【题目描述】
从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。
每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。
以@作为结束标志。
提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在264范围内,如有除法保证能整除。
【输入】
一个后缀表达式。
【输出】
一个后缀表达式的值。
【输入样例】
16 9 4 3 +*-@
【输出样例】
-47
【来源】
No
【代码】
#include <stdio.h>
#include <string.h>
char a[10000];
long long stack[1000],top=-1;
int main()
{
long long k=0,i=0,len,b,tag,d,e,f;
char c;
gets(a);
len=strlen(a);
while(i<len)
{
b=0,tag=0;
while(i<len&&'0'<=a[i]&&a[i]<='9')
b*=10,b+=a[i]-'0',i++,tag=1;
if(tag) top++,stack[top]=b;
else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')
{
d=stack[top],top--;
e=stack[top],top--;
switch(a[i]){
case '+':
f=e+d;
break;
case '-':
f=e-d;
break;
case '*':
f=e*d;
break;
case '/':
f=e/d;
break;
}
top++;
stack[top]=f;
i++;
}
else i++;
}
printf("%lld",stack[top]);
return 0;
}