题目要求:
给出一个表达式,其中运算符仅包含 +,-,*,/,^ 要求求出表达式的最终值。
数据可能会出现括号情况,还有可能出现多余括号情况
数据可能会出现负数情况,幂次不可能为负数,除法采用向 0 取整。
注意:−9 和 +9 分别代表负数和正数的 9
个别样例:
样例1:((((7+9)^(1+3)) 答案:65536
样例2:51+89-56 – 78 答案:162
样例3:(-79+48+76-45+98) 答案:98
看似简单,细节却多到令人厌烦的表达式计算:
源码:
#include<iostream>
#include<stack>
#include<cstring>
#include<cmath>
using namespace std;
int calc(int a, int b, char op) {
int ret;
switch(op) {
case '+': {
ret = a + b;
} break;
case '-': {
ret = a - b;
} break;
case '*': {
ret = a * b;
} break;
case '/': {
ret = a / b;
} break;
case '^': {
ret = pow(a, b);
} break;
}
return ret;
}
int operation(stack<int> &sta_num, stack<char> &sta_op) {
int a = sta_num.top();
sta_num.pop();
int b = sta_num.top();
sta_num.pop();
//cout << b << sta_op.top() << a << endl;
int ret = calc(b, a, sta_op.top()); //需要交换a,b顺序
sta_num.push(ret);
sta_op.pop(); //弹出用过的op
return ret;
}
int precede(char op1, char op2) {
if (op2 == '(') return 1;
if (op1 == '^' && op2 != '^') return 1;
if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')){
return 1;
} else {
return 0;
}
}
int main() {
char buffers[1005];
cin >> buffers;
stack<int> numbers;
stack<char> ops;
int flag = 0;
int num = 0;
int n = strlen(buffers);
int i = 0;
while (i < n) {
//cout << "ind :" << i + 1 << endl;
if (isdigit(buffers[i])) {
num = num * 10 + buffers[i] - '0';
i++;
//若后一个数字不为数字字符,则完整获取number,数的正负参考flag
if (!isdigit(buffers[i])) {
flag == 1 && (num = 0 - num);
numbers.push(num);
num = 0, flag = 0; //数字压栈,临时变量清0
}
} else if (buffers[i] == '('){
ops.push(buffers[i]);
i++;
} else if(buffers[i] == ')') {
//计算()内的表达式
while(!ops.empty() && ops.top() != '(') {
operation(numbers, ops);
}
ops.pop();
i++;
} else {
if (buffers[i] == '-') {
//处理多余-号,符号取反
if (i == 0 || (i > 0 && (!isdigit(buffers[i - 1]) && buffers[i - 1] != ')'))) {
flag ^= 1;
i++;
continue;
}
} else if (buffers[i] == '+') {
//处理多余加号,直接跳过
if (i == 0 || (i > 0 && (!isdigit(buffers[i - 1]) && buffers[i - 1] != ')'))) {
i++;
continue;
}
}
if (ops.empty() || precede(buffers[i], ops.top())) {
ops.push(buffers[i]);
i++;
} else {
operation(numbers, ops);
}
}
}
while (!ops.empty() && ops.top() != '(') {
operation(numbers, ops);
}
cout << numbers.top() << endl;
return 0;
}