刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

4.## 中缀表达式的值
人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7))。在程序设计语言中,可以利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值。 给定一个中缀表达式,编写程序,利用堆栈的方法,计算表达式的值。
时间限制:200
内存限制:65536
输入
第一行为测试数据的组数N 接下来的N行,每行是一个中缀表达式。表达式中只含数字、四则运算符和圆括号,操作数都是正整数,数和运算符、括号之间没有空格。中缀表达式的字符串长度不超过600。
输出
对每一组测试数据输出一行,为表达式的值
样例输入
3
3+5*8
(3+5)*8
(23+34*45/(5+6+7))
样例输出
43
64
108
提示
注意:运算过程均为整数运算(除法运算'/'即按照C++定义的int除以int的结果,测试数据不会出现除数为0的情况),输出结果也为整数(可能为负)。 中间计算结果可能为负。

使用微信搜索喵呜刷题,轻松应对考试!

答案:

```#include #include #include #include using namespace std;int calculate(string expression) stack operatorStack;string temp = "";for (int i = 0; i < expression.length(); i++) {if (isdigit(expression[i])) {temp += expression[i];} else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') {if (temp != "") {int num = stoi(temp);temp = "";if (operatorStack.empty() || (expression[i] == '/' && operatorStack.top() == '*')) {operatorStack.push(expression[i]);} else {while (!operatorStack.empty() && (expression[i] == '+' || expression[i] == '-' || (expression[i] == '/' && operatorStack.top() != '*'))) {char op = operatorStack.top();operatorStack.pop();if (temp != "") {int num2 = stoi(temp);temp = "";if (op == '+') {num += num2;} else if (op == '-') {num -= num2;} else if (op == '*') {num *= num2;} else if (op == '/') {num /= num2;}}}operatorStack.push(expression[i]);}}} else if (expression[i] == '(') {operatorStack.push(expression[i]);} else if (expression[i] == ')') {while (!operatorStack.empty() && operatorStack.top() != '(') {char op = operatorStack.top();operatorStack.pop();if (temp != "") {int num2 = stoi(temp);temp = "";if (op == '+') {num += num2;} else if (op == '-') {num -= num2;} else if (op == '*') {num *= num2;} else if (op == '/') {num /= num2;}}}operatorStack.pop();}}while (!operatorStack.empty()) {char op = operatorStack.top();operatorStack.pop();if (temp != "") {int num2 = stoi(temp);temp = "";if (op == '+') {num += num2;} else if (op == '-') {num -= num2;} else if (op == '*') {num *= num2;} else if (op == '/') {num /= num2;}}}return num;int main() int N;cin >> N;for (int i = 0; i < N; i++) {string expression;cin >> expression;cout << calculate(expression) << endl;}return 0;```

解析:

【喵呜刷题小喵解析】:

本题要求编写程序,利用堆栈的方法,计算中缀表达式的值。

解题思路:

首先,我们需要实现一个堆栈数据结构,用来保存运算符和运算数。

然后,遍历输入的表达式字符串,如果遇到数字,就将其加入到一个临时字符串中,如果遇到运算符,则需要进行运算。

在运算时,我们需要根据运算符的优先级和结合性,从堆栈中取出运算符,进行运算,并将结果压入堆栈中。

最后,当遍历完整个表达式字符串后,堆栈中剩下的就是最终的结果,将其输出即可。

在实现时,我们需要注意以下几点:

1. 对于除法运算,我们需要按照C++定义的int除以int的结果来处理,即结果为整数除法。

2. 在运算时,我们需要注意运算符的优先级和结合性,以保证运算的正确性。

3. 在计算完一组测试数据后,我们需要将堆栈清空,以便计算下一组测试数据。

以上是实现中缀表达式计算的一种常见方法,可以根据具体的需求和实际情况进行修改和优化。
创作类型:
原创

本文链接:4.## 中缀表达式的值人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share