后缀表达式的计算方法

    1. 如果遇到操作数,将其压入操作数栈中;
    2. 如果遇到操作符,弹出操作数栈顶元素b,再弹出下一个操作数栈顶元素a,执行运算a 操作符 b,并将结果入栈;
    3. 最后操作数栈只剩最后一个元素,即为表达式的值

    示例:1 2 3 * - 4 5 6 - * 7 + 8 / + 9 +

    1. 1 2 3 依次入栈
    • 操作数栈为[1 2 3]
    1. 遇到操作符,弹出3、弹出2,执行23,结果为6,6入栈
    • 操作数栈为[1 6]
    1. 遇到操作符-,弹出6、弹出1,执行1-6,结果为-5,-5入栈
    • 操作数栈为[-5]
    1. 4 5 6 依次入栈
    • 操作数栈为[-5 4 5 6]
    1. 遇到操作符-,弹出6、弹出5,执行5-6,结果为-1,-1入栈
    • 操作数栈为[-5 4 -1]
    1. 遇到操作符,弹出-1、弹出4,执行4-1,结果为-4,-4入栈
    • 操作数栈为[-5 -4]
    1. 7入栈
    • 操作数栈为[-5 -4 7]
    1. 遇到操作符+,弹出7、弹出-4,执行7+-4,结果为3,3入栈
    • 操作数栈为[-5 3]
    1. 8入栈
    • 操作数栈为[-5 3 8]
    1. 遇到操作符/,弹出8、弹出3,执行3/8,结果为0,0入栈
    • 操作数栈为[-5 0]
    1. 遇到操作符+,弹出0、弹出-5,执行-5+0,结果为-5,-5入栈
    • 操作数栈为[-5]
    1. 9入栈
    • 操作数栈为[-5 9]
    1. 遇到操作符+,弹出9、弹出-5,执行-5+9,结果为4,4入栈
    • 操作数栈为[4]
    1. 表达式最终值为4

    结束

    1. class Solution {
    2. public:
    3. /**
    4. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    5. * 返回表达式的值
    6. * @param s string字符串 待计算的表达式
    7. * @return int整型
    8. */
    9. int solve(string s) {
    10. // write code here
    11. vector<string> infOrder, sufOrder;
    12. this->strParser(s, infOrder);
    13. printVector(infOrder);
    14. this->infill2suffix(infOrder, sufOrder);
    15. printVector(sufOrder);
    16. return this->suffix2val(sufOrder);
    17. }
    18. int suffix2val(vector<string>& sufOrder){
    19. // 后缀表达式求值
    20. stack<int> numStack;
    21. int a, b;
    22. for(string str : sufOrder){
    23. if(isOperator(str)){
    24. b = numStack.top();
    25. numStack.pop();
    26. a = numStack.top();
    27. numStack.pop();
    28. if(str == "+"){
    29. numStack.push(a + b);
    30. }else if(str == "-"){
    31. numStack.push(a - b);
    32. }else if(str == "*"){
    33. numStack.push(a * b);
    34. }else{
    35. numStack.push(a / b);
    36. }
    37. }
    38. else{
    39. numStack.push(atoi(str.c_str()));
    40. }
    41. }
    42. return numStack.top();
    43. }
    44. void infill2suffix(vector<string>& infOrder, vector<string>& sufOrder){
    45. // 中缀表达式转后缀表达式
    46. sufOrder.clear();
    47. stack<string> opStack;
    48. for(string str : infOrder){
    49. if(isOperator(str)){
    50. if(opStack.empty() || str=="("){
    51. opStack.push(str);
    52. }
    53. else if(str == ")"){
    54. while(opStack.top() != "("){
    55. sufOrder.push_back(opStack.top());
    56. opStack.pop();
    57. }
    58. opStack.pop();
    59. }
    60. else{
    61. while(!opStack.empty() && isHigherOperator(opStack.top(), str)){
    62. sufOrder.push_back(opStack.top());
    63. opStack.pop();
    64. }
    65. opStack.push(str);
    66. }
    67. }
    68. else{
    69. sufOrder.push_back(str);
    70. }
    71. }
    72. while(!opStack.empty()){
    73. sufOrder.push_back(opStack.top());
    74. opStack.pop();
    75. }
    76. }
    77. void strParser(string& s, vector<string>& ret){
    78. // 解析字符串,将数字和符号分开
    79. string curStr = "";
    80. for(char ch : s){
    81. if(ch >= '0' && ch <= '9'){
    82. curStr += ch;
    83. }
    84. else{
    85. if(curStr != ""){
    86. ret.push_back(curStr);
    87. }
    88. ret.push_back(string(1, ch));
    89. curStr = "";
    90. }
    91. }
    92. if(curStr != ""){
    93. ret.push_back(curStr);
    94. }
    95. }
    96. bool isOperator(string& op){
    97. for(int i=0; i<this->ops.size(); i++){
    98. if(op == this->ops[i]){
    99. return true;
    100. }
    101. }
    102. return false;
    103. }
    104. bool isHigherOperator(string& op1, string& op2){
    105. // 判断op1是否比op2的优先级较高
    106. return this->opsPriority[op1] >= this->opsPriority[op2];
    107. }
    108. private:
    109. vector<string> ops={"+", "-", "*", "/", "(", ")"};
    110. map<string, int> opsPriority = {
    111. {"(", 0},
    112. {"+", 1}, {"-", 1},
    113. {"*", 2}, {"/", 2}
    114. };
    115. };