算术表达式的转换

本文介绍了一种通过将输入的四则运算表达式转换为波兰表达式(后序遍历),然后利用栈构建二叉树的方法。作者提供了C++代码示例,展示了如何获取后序遍历结果并打印出来。
摘要由CSDN通过智能技术生成

题目:输入一个表达式(保护括号和四则运算),输出前中后序遍历。

思路:通过求出波兰表达式(后序),再进行二叉树建树的操作。

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 100;
int mp[50], n;
string s, posodr;

struct node {
	int l, r;
	char val;
} tr[MAXN];

void getPosorder() {
	stack<char> stk;
	for (int i = 1; i <= n; i++) {
		if (isdigit(s[i])) posodr += s[i];
		else if (s[i] == '(') stk.push('(');
		else if (s[i] == ')') {
			while (stk.top() != '(') {
				posodr += stk.top();
				stk.pop();
			}
			stk.pop();
		} else {
			while (stk.size() && mp[stk.top()] >= mp[s[i]]) {
				posodr += stk.top();
				stk.pop();
			}
			stk.push(s[i]);
		}
	}
	while (stk.size() != 0) {
		posodr += stk.top();
		stk.pop();
	}
}

void buildTree() {
	posodr = " " + posodr;
	stack<int> stk;
	for (int i = 1; i <= posodr.size() - 1; i++) {
		tr[i].val = posodr[i];
		if (isdigit(posodr[i])) stk.push(i);
		else {
			tr[i].r = stk.top();
			stk.pop();
			tr[i].l = stk.top();
			stk.pop();
			stk.push(i);
		}
	}
	return;
}

string ans1, ans2, ans3;
void printTree(int x) {
	ans1.push_back(tr[x].val);
	if (tr[x].l) printTree(tr[x].l);
	ans2.push_back(tr[x].val);
	if (tr[x].r) printTree(tr[x].r);
	ans3.push_back(tr[x].val);
	return;
}

int main() {
	mp['+'] = 1, mp['-'] = 1, mp['*'] = 2, mp['/'] = 2;
	cin >> s;
	n = s.size() - 1;
	s = " " + s;
	getPosorder();
	buildTree();
	printTree(posodr.size() - 1);
	cout << ans1 << "\n" << ans2 << "\n" << ans3;
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值