Task A1 中缀表达式转换为逆波兰式

A1 表达式转换

【题目描述PTA(数据结构与算法题目集 7-20)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表
示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、/以及左右括号(),表达式不超过 20 个
字符。
输出格式
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾
不得有多余空格。
输入样例

2+3*(7-4)+8/4

输出样例

2 3 7 4 - * + 8 4 / +

问题分析
算术表达式有中缀表达式,前缀表达式和后缀表达式等形式。将中缀表达式转化为后缀表达式(也称逆波兰式表示法)是一种常见的计算问题,我们可以使用栈数据结构来解决。下面是算法步骤:

  1. 初始化一个空的操作数栈,用于存放操作符。
  2. 从左到右扫描中缀表达式的每一个元素。
  3. 如果遇到的是操作数,数字,则直接添加到输出队列的末尾。
  4. 如果遇到操作符+-*/,则做以下处理:
    • 将栈顶元素弹出并添加到输出队列,知道栈顶的操作符优先级低于或等于当前操作符的优先级。
    • 将当前操作符压入栈中。
  5. 如果遇到左括号,压入栈中。
  6. 如果遇到右括号,则从栈中弹出操作符并添加到输出队列,知道遇到左括号为止,此时,将左括号从栈中移除,但不添加到输出队列。
  7. 当所有表达式的所有元素都处理完了后,将栈中剩余操作符一次弹出并添加到输出队列,直到为空。

根据上述算法,我们可以写出多条件语句代码:

#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;
}

运行结果如下:

posted @   YunC  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡
点击右上角即可分享
微信分享提示