Task A1 中缀表达式转换为逆波兰式
A1 表达式转换
【题目描述PTA(数据结构与算法题目集 7-20)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表
示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、/以及左右括号(),表达式不超过 20 个
字符。
输出格式
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾
不得有多余空格。
输入样例
2+3*(7-4)+8/4
输出样例
2 3 7 4 - * + 8 4 / +
问题分析
算术表达式有中缀表达式,前缀表达式和后缀表达式等形式。将中缀表达式转化为后缀表达式(也称逆波兰式表示法)是一种常见的计算问题,我们可以使用栈数据结构来解决。下面是算法步骤:
- 初始化一个空的操作数栈,用于存放操作符。
- 从左到右扫描中缀表达式的每一个元素。
- 如果遇到的是操作数,数字,则直接添加到输出队列的末尾。
- 如果遇到操作符+-*/,则做以下处理:
- 将栈顶元素弹出并添加到输出队列,知道栈顶的操作符优先级低于或等于当前操作符的优先级。
- 将当前操作符压入栈中。
- 如果遇到左括号,压入栈中。
- 如果遇到右括号,则从栈中弹出操作符并添加到输出队列,知道遇到左括号为止,此时,将左括号从栈中移除,但不添加到输出队列。
- 当所有表达式的所有元素都处理完了后,将栈中剩余操作符一次弹出并添加到输出队列,直到为空。
根据上述算法,我们可以写出多条件语句代码:
#include<iostream>
using namespace std;
// 运算符优先级
int priority(char op) {
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
return 0; // 其他情况比如括号
}
// 判断是否为运算符
bool isOperator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
class Stack { // 栈类
private:
int top;
public:
char data[20]; //不超过20个字符
Stack() { top = -1; }//构造函数
bool isEmpty() { return top == -1; }
void push(char ch) { data[++top] = ch; }
char pop() { return data[top--]; }
char Top() { return data[top]; }
};
string getsuffix(string& infix) {
string suffix;
Stack s;
// 遍历中缀表达式,如果是数字,加入后缀表达式;
// 如果是运算符,判断优先级,如果栈中元素大于或等于当前运算符,弹出栈顶元素,否则压入栈;
// 如果遇到右括号,弹出栈中元素,直到遇到左括号,左括号不加入后缀表达式。
for (char ch : infix)
{
if (isalnum(ch)) { //数字或字母
suffix += ch;
suffix += ' ';
}
else if (ch == '(') { //左括号
s.push(ch);
}
else if (ch == ')') { //右括号
while (!s.isEmpty() && s.Top() != '(') {
suffix += s.pop();
suffix += ' ';
}
s.pop();//弹出左括号,不加入后缀表达式
}
else if (isOperator(ch)) {
//弹出大于等于当前优先级的运算符
while (!s.isEmpty() && priority(s.Top()) >= priority(ch)) {
suffix += s.pop();
suffix += ' ';
}
s.push(ch);//压入当前运算符
}
}
//将剩余的运算符加入后缀表达式
while (!s.isEmpty()) {
suffix += s.pop();
suffix += ' ';
}
//去掉最后一个空格
if (!suffix.empty()) {
suffix.pop_back();
}
return suffix;
}
int main() {
cout << "请输入中缀算术表达式:" << endl;
string infix;
cin >> infix;
cout << "后缀表达式为:" << endl << getsuffix(infix) ;
return 0;
}
运行结果如下:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡