中缀表达式转后缀表达式
一个非常简单的中缀表达式转后缀表达式
输入:
一个中缀算术表达式,操作数限定为0~9,运算法则限定为+、-、*、/。
输出:
一个后缀(逆波兰式)算术表达式
例子:
- 输入:1+(9-3)*3
- 输出:1 9 3 - 3 * +
#include<iostream>
#include<stack>
#include<queue>
#include<string>
using namespace std;
//优先级比较函数
int bgthan(char ch1, char ch2) {
//从左到右,一次是+,-,*,/的优先级,数字越大越高
char op[5] = { '+','-','*','/','('};
int a[][5] = {
{0,0,0,0,0},
{0,0,0,0,0},
{1,1,1,1,0},
{1,1,1,1,0},
{0,0,0,0,0}
};
int i, j;
for (i = 0; i < 5; i++) {
if (ch1 == op[i])break;
}
for (j = 0; j < 5; j++) {
if (ch2 == op[j])break;
}
return a[i][j];
}
//中缀转后缀表达式
string pre2post(string pre) {
int n = pre.length(); //表达式的长度
stack<char> opter; //操作符栈
string post = "";
for (int i = 0; i < n; i++) {
if (pre[i] >= '0'&&pre[i] <= '9') { //数字直接输出
post += pre[i]; //添加到末尾
post += ' '; //添加空格分割
}
else { //操作符
//左括号或者栈空直接入栈
if (pre[i] == '('||opter.empty()) {
opter.push(pre[i]);
}
//如果是右括号
else if (pre[i] == ')') {
//出栈直到遇到'(’
while (opter.top() != '(') {
post += opter.top();
post += ' ';
opter.pop();
}
opter.pop(); //弹出'('
if (opter.empty()) {
cout << "栈已空" << endl;
}
}
//运算符则比较优先级
else
{
//栈顶元素优先的话
if (bgthan(opter.top(), pre[i])) {
post += opter.top();
opter.pop(); //出栈
post += ' ';
}
//入栈
opter.push(pre[i]);
}
}
}
while (!opter.empty()) {
post += opter.top();
opter.pop();
}
return post;
}
int main() {
string str;
cin >> str;
cout << pre2post(str) << endl;
system("pause");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!