• 后缀表达式求值


           后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行。

    运用后缀表达式进行计算的具体做法:

    建立一个操作数栈S。然后从左到右读表达式,如果读到操作数就将它压入栈S中,如果读到n元运算符(即需要参数个数为n的运算符)则取出由栈顶向下的n项操作数进行运算,再将运算的结果代替原栈顶的n项压入栈中。重复上面过程,如果后缀表达式读完且栈中只剩一个操作数,则该数就是运算结果;如果后缀表达式读完但是栈中操作数多于一个,则后缀表达式错误;如果栈中操作数只剩一个,但是后缀表达式还未读完且当前运算符为双元操作符,则后缀表达式同样错误。

    输入格式:

    在一行中输入一个以#号结束的非空后缀式,#不属于表达式的一部分,操作数和运算符都以空格分隔,运算数为绝对值不超过100的整数,运算符仅有+、-、*、/ 四种。

    输出格式:

    输出后缀式计算结果,所有的计算都只取结果的整数部分。题目保证计算的中间和最后结果的绝对值都不超过109。

    如果执行除法时出现分母为零的非法操作,则在一行中输出:Error: X/0,X是当时的分子。

    如果后缀表达式中运算符多了或者少了,则在一行中输出:Expression Error: X,X是当时栈顶元素。

    输入样例1:

    5 -2 + 3 * #
    

    输出样例1:

    9
    

    输入样例2:

    5 -2 2 + / #
    

    输出样例2:

    Error: 5/0
    

    输入样例3:

    5 -1 3 + / - * #
    

    输出样例3:

    Expression Error: 2
    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. int judge(string ch)//判断是运算符
    7. {
    8. if (ch == "+" || ch == "-" || ch == "*" || ch == "/")
    9. return 1;
    10. else
    11. return 0;
    12. }
    13. int jisuan(int n1, int n2, string ch)//计算
    14. {
    15. if (ch == "+")
    16. return n1 + n2;
    17. else if (ch == "-")
    18. return n1 - n2;
    19. else if (ch == "*")
    20. return n1 * n2;
    21. else
    22. return n1 / n2;
    23. }
    24. int main()
    25. {
    26. stack<int> num;
    27. int a, k = 0;
    28. int n1, n2, n3;
    29. string ch;
    30. while (cin >> ch)//输入字符
    31. {
    32. if (ch == "#")//#结束
    33. break;
    34. if (!judge(ch))//不为运算符,将a转化为int类型,入栈
    35. {
    36. stringstream stream;
    37. stream << ch; stream >> a;
    38. num.push(a);
    39. }
    40. else//为运算符
    41. {
    42. n1 = num.top();//取栈顶元素
    43. num.pop();
    44. if (num.empty())//栈为空,说明运算符多了,表达式不符合
    45. {
    46. cout << "Expression Error: " << n1;
    47. break;
    48. }
    49. n2 = num.top();//取第二个元素
    50. num.pop();
    51. if (n1 == 0 && ch == "/")//先判断是否出现分母为零的非法操作
    52. {
    53. cout << "Error: " << n2 << "/" << n1;
    54. break;
    55. }
    56. else//进行运算
    57. {
    58. n3 = jisuan(n2, n1, ch);
    59. num.push(n3);
    60. }
    61. }
    62. }
    63. if (num.size() < 2 && ch == "#")//栈里只剩一个元素,即为答案输出
    64. cout << num.top() << endl;
    65. if (num.size() >= 2 && ch == "#")//栈里多于一个元素,即运算符少了,表达式不符合
    66. cout << "Expression Error: " << num.top();
    67. }

  • 相关阅读:
    文献学习-6-微创手术中视频检索的无监督特征解缠
    [附源码]java毕业设计高校运动会管理信息系统
    【机器学习】支持向量回归
    如何优雅的开发?试试这个低代码项目
    Vue3基础知识-1
    Kubernetes已然崛起,Kubernetes实战手册帮你轻松拿下
    Docker从入门到放弃(1) Docker简介与安装
    前端周刊第三十三期
    CMT2380F32模块开发19-LVD例程
    Python逆向爬虫之pyquery,非常详细
  • 原文地址:https://blog.csdn.net/qq_74156152/article/details/133282853