逆波兰算数表达式

逆波兰算术表达式

    传统的算术表达式是由操作数(又叫运算对象或运算量)和运算符以及改变运算次序的圆括号连接而成的式子。  其运算规则如下: 

    (1) 先计算括号内,后计算括号外;   
    (2) 在无括号或同层括号内,先进行乘除运算,后进行加减运算,即乘除运算的优先级高于加减运算的优先级;   
    (3) 同一优先级运算,从左向右依次进行。 

    在这种表达式的计算过程中,既要考虑括号的作用,又要考虑运算符的优先级,还要考虑运算符出现的先后次序。

    波兰科学家卢卡谢维奇(Lukasiewicz)提出了算术表达式的另一种表示,即后缀表示,又称逆波兰式,其定义是把运算符放在两个运算对象的后面。在后缀表达式中,不存在括号,也不存在优先级的差别,计算过程完全按照运算符出现的先后次序进行,整个计算过程仅需一遍扫描便可完成。

例如:
            3/5+6的逆波兰表达式为3 5 / 6 +
            2*(3+4)的逆波兰表达式为2 3 4 + *

输入:
            一个只包含加、减、乘、除和数字的逆波兰表达式

输出:
            该表达式的值

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 2 以文本方式显示
  1. 2 3 + 5 *↵
以文本方式显示
  1. 25↵
1秒 64M 0
代码:
#include 
#include 

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]);
}


你可能感兴趣的:(C/C++)