(附代码)中缀表达式转化为后缀表达式(可含括号,可含小数),并计算后缀表达式的结果

本文介绍了如何使用Java将包含括号和小数的中缀表达式转换为后缀表达式,并计算后缀表达式的结果。通过遍历中缀表达式的字符列表,利用栈和队列进行操作,详细阐述了转换过程中的判断逻辑。最后,给出了计算后缀表达式的算法,只需一个运算数栈,逐个处理后缀表达式的元素即可得出结果。
摘要由CSDN通过智能技术生成

应知道,计算机不好处理中缀表达式,最好转化为后缀表达式计算

代码附在文末


代码思想:(皆按代码编写顺序解释)

First,

若中缀表达式用string表示,需先将其拆分为运算符( +,-,*,/,(,) )和运算数,存在列表list中以便处理

Second,

我们需要一个栈Stack_op,来暂存运算符(现在还轮不到它来算的)

我们需要一个队列(列表也行)Que_final,来按顺序依次存放后缀表达式的元素

Third,

我们遍历中缀list,获得当前位置元素elem

(1)如果当前元素elem是左括号“(” ,直接压入Stack_op栈中

(2)如果当前元素elem是“+","-","*","/",我们比较它与Stack_op的栈顶元素:

              a.  如果Stack_op栈为空,则直接压入Stack_op中

              b.  如果栈顶元素是"(",则直接将当前元素压入Stack_op栈中

              c.  如果栈顶元素是+-*/, 且栈顶元素优先级 >= 当前元素优先级 (乘=除>加=减)则将栈顶元素弹出,并加入结果

好的,我来为你写一个把含小数和负数的中缀表达式转换后缀表达式的函数。 思路如下: 1. 定义一个栈,保存运算符和左括号。 2. 遍历中缀表达式的每个元素。 3. 如果是数字,直接输出。 4. 如果是左括号,入栈。 5. 如果是右括号,将栈中运算符弹出并输出,直到遇到左括号。 6. 如果是运算符,弹出栈中所有优先级大于或等于该运算符的运算符,并输出,然后将该运算符入栈。 7. 遍历完整个表达式后,将栈中所有运算符弹出并输出。 以下是代码实现: ```c++ #include <iostream> #include <stack> #include <string> #include <sstream> #include <cmath> using namespace std; // 判断是否是运算符 bool isOperator(char c) { return (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')'); } // 比较运算符优先级 int priority(char op) { if (op == '+' || op == '-') { return 1; } else if (op == '*' || op == '/') { return 2; } else { return 0; } } // 将中缀表达式转换后缀表达式 string infixToPostfix(string infix) { stack<char> s; stringstream ss; char c; for (int i = 0; i < infix.length(); i++) { c = infix[i]; // 是数字,直接输出 if (isdigit(c) || c == '.') { ss << c; } // 是运算符 else if (isOperator(c)) { // 如果是负数,则加上一个0 if (c == '-' && (i == 0 || isOperator(infix[i - 1]))) { ss << "0 "; } // 如果是左括号,入栈 else if (c == '(') { s.push(c); } // 如果是右括号,弹出栈中的运算符并输出,直到遇到左括号 else if (c == ')') { while (s.top() != '(') { ss << s.top() << " "; s.pop(); } s.pop(); } // 如果是其他运算符,弹出栈中所有优先级大于或等于该运算符的运算符,并输出,然后将该运算符入栈 else { while (!s.empty() && s.top() != '(' && priority(s.top()) >= priority(c)) { ss << s.top() << " "; s.pop(); } s.push(c); } } } while (!s.empty()) { ss << s.top() << " "; s.pop(); } return ss.str(); } int main() { string infix = "2.5+(3-1)*4-3/2"; string postfix = infixToPostfix(infix); cout << postfix << endl; // 输出:2.5 3 1 - 4 * + 3 2 / - return 0; } ``` 希望能帮助到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值