逆波兰算术表达式
传统的算术表达式是由操作数(又叫运算对象或运算量)和运算符以及改变运算次序的圆括号连接而成的式子。 其运算规则如下:
(1) 先计算括号内,后计算括号外;
(2) 在无括号或同层括号内,先进行乘除运算,后进行加减运算,即乘除运算的优先级高于加减运算的优先级;
(3) 同一优先级运算,从左向右依次进行。
在这种表达式的计算过程中,既要考虑括号的作用,又要考虑运算符的优先级,还要考虑运算符出现的先后次序。
波兰科学家卢卡谢维奇(Lukasiewicz)提出了算术表达式的另一种表示,即后缀表示,又称逆波兰式,其定义是把运算符放在两个运算对象的后面。在后缀表达式中,不存在括号,也不存在优先级的差别,计算过程完全按照运算符出现的先后次序进行,整个计算过程仅需一遍扫描便可完成。
例如:
3/5+6的逆波兰表达式为3 5 / 6 +
2*(3+4)的逆波兰表达式为2 3 4 + *
输入:
一个只包含加、减、乘、除和数字的逆波兰表达式
输出:
该表达式的值
#include <stdio.h>
#include <string.h>
int tranfer(char *s)
{
int k=1,result=0,len = strlen(s);
while(len--)
{
result += (s[len]-'0')*k;
k *= 10;
}
return result;
}
main( )
{
char s[5];
int j=0,num[100];
while((scanf("%s",s))!=EOF)
{
if(s[0]>='0'&&s[0]<='9')
num[j++] = tranfer(s);
else
{
switch(s[0]){
case '+':
num[j-2] += num[j-1];
j--;
break;
case '-':
num[j-2] -= num[j-1];
j--;
break;
case '*':
num[j-2] *= num[j-1];
j--;
break;
case '/':
num[j-2] /= num[j-1];
j--;
break;
}
}
}
printf("%d\n",num[0]);
}