利用栈对表达式进行求解
描述
输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括【0
-9
】、+
、-
、 *
、/
、(
、 )
、[
、]
、{
、}
,且表达式一定合法。
输入描述:
输入一个算术表达式
输出描述:
得到计算结果
示例一
输入:
$3+2{1+2[-4/(8-6)+7]}$
输出:
25
示例二
输入:
$5-3+96(6-10-2)$
输出:
-322
中缀表达式的计算
将中缀转后缀、后缀表达式的计算两个步骤合并。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
| #include <iostream> #include <vector> #include <stack> using namespace std;
void pop_count_push (stack<int>& v_num, stack<char>& v_sign) { char sign = v_sign.top(); v_sign.pop();
int num1 = v_num.top(); v_num.pop(); int num2 = v_num.top(); v_num.pop();
int res; switch (sign) { case '+': res = num2 + num1; break;
case '-': res = num2 - num1; break;
case '*': res = num2 * num1; break;
case '/': res = num2 / num1; break;
default: break; }
v_num.push(res); }
int priority (char c) { if (c == '*' || c == '/') { return 2; } else { return 1; } }
int count_expression (string str) { stack<int> v_num; stack<char> v_sign;
for (int i = 0; i < str.length(); ++i) { if (i == 0 && str[i] == '-') { str = "0" + str; } else if (str[i] == '-' && (str[i - 1] == '(' || str[i - 1] == '[' || str[i - 1] == '{')) { str.insert(i, "0"); } }
bool flag = false; for (char c : str) { if (c >= '0' && c <= '9') { if (!flag) { flag = true; v_num.push(c - '0'); } else { int num = v_num.top() * 10 + (c - '0'); v_num.pop(); v_num.push(num); } }
else { flag = false;
if (c == '(' || c == '[' || c == '{') { v_sign.push(c); }
else if (c == ')' || c == ']' || c == '}') { while (v_sign.top() != '(' && v_sign.top() != '[' && v_sign.top() != '{') { pop_count_push(v_num, v_sign); } v_sign.pop(); }
else { while (!v_sign.empty()) { if (v_sign.top() == '(' || v_sign.top() == '[' || v_sign.top() == '{') { break; } if (priority(v_sign.top()) >= priority(c)) { pop_count_push(v_num, v_sign); } else { break; } } v_sign.push(c); } } }
while (!v_sign.empty()) { pop_count_push(v_num, v_sign); }
int result = v_num.top(); return result; }
int main () { string str; cin >> str;
cout << count_expression(str) << endl; }
|