逆波兰算数表达式

逆波兰算术表达式

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

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

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

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

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

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

输出:
            该表达式的值

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 2 以文本方式显示
  1. 2 3 + 5 *↵
以文本方式显示
  1. 25↵
1秒 64M 0
代码:
#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]);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值