• P1449 后缀表达式题解


    题目

    所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

    本题中运算符仅包含+-*/。保证对于/运算除数不为0。特别地,其中/运算的结果需要向0取整(即与C++/运算的规则一致)。

    如:3*(5-2)+7对应的后缀表达式为:3.5.2.-*7.+@。在该式中,@表达式的结束符号。.为操作数的结束符号。

    输入输出格式

    输入格式

    输入一行一个字符串s,表示后缀表达式。

    输出格式

    输出一个整数,表示表达式的值。

    输入输出样例

    输入样例

    3.5.2.-*7.+@

    输出样例

    16

    补充知识

    STL库中的stack帮我们实现栈的相关功能,有以下几种方法。

    (1)stack s:建立一个栈s,其内部元素类型是int

    (2)s.push(a):将元素a压进栈s

    (3)s.pop():将s的栈顶元素弹出

    (4)s.top():查询s的栈顶元素

    (5)s.size():查询s的元素个数

    (6)s.empty():查询s是否为空

    解析

    阅读一个后缀表达式的方法是:从左往右读式子,一旦遇到运算符,就往前取n个数--这个n取决于运算符有多少个参数--然后擦掉这些参数和这个运算符,把计算结果写在那里。接下来,重复刚才的操作,直到表达式中只剩下一个数为止。

    对于后缀表达式2 4 * 1 3 + -,处理方式如下:首先从左往右读,读到了乘号。乘法有两个参数,所以取出前面的2和4,算出2*4=8。现在,擦掉2 4 *,写下8,式子变成:8 1 3 + -。读到加号之后,取出前面的1和3,算出1+3=4,把式子改写成:8 4 -。接着,还是从头开始读这个式子。读到减号之后取出8和4,算出8-4=4,于是最后的式子就是4。

    1. #include<stack>
    2. #include<cstdio>
    3. using namespace std;
    4. stack<int> n;
    5. int s=0,x,y;
    6. int main(){
    7. char ch;
    8. do{
    9. ch=getchar();
    10. if(ch>='0'&&ch<='9'){
    11. s=s*10+ch-'0';
    12. }
    13. else if(ch=='.'){
    14. n.push(s);
    15. s=0;
    16. }
    17. else if(ch!='@'){
    18. x=n.top();
    19. n.pop();
    20. y=n.top();
    21. n.pop();
    22. switch(ch){
    23. case '+':n.push(x+y);break;
    24. case '-':n.push(y-x);break;
    25. case '*':n.push(x*y);break;
    26. case '/':n.push(y/x);break;
    27. }
    28. }
    29. }while(ch!='@');
    30. printf("%d\n",n.top());
    31. return 0;
    32. }
  • 相关阅读:
    虹科Pico汽车示波器 | 免拆诊断案例 | 2006 款林肯领航员车发动机怠速抖动
    算法练习-LeetCode Hot 100 2. 两数相加
    SAP 的数据战略之数据素养
    第147篇 笔记-预言机(Oracle)
    git全局设置账号及ssh连接公私钥获取
    mediapipe 实现姿态分析——举手检测
    python实现图片压缩和word排版
    linux安装Jdk
    别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅
    RabbitMQ工作模式-路由模式
  • 原文地址:https://blog.csdn.net/m0_72674633/article/details/136369900