中缀表达式转后缀表达式(C++实现)

原文链接:https://blog.csdn.net/qq_29186859/article/details/97624162

以a+bc(de+f)*g为例:

1、由左向右遍历表达式,首先遇到a,直接将其输出。

此时输出为:a

栈的情况为:空

2、继续遍历,遇到+,将其放入栈中。

此时输出为:a

栈的情况为:+

3、继续遍历,遇到b,直接将其输出。

此时输出为:ab

栈的情况为:+

4、继续遍历,遇到,因为的优先级大于栈顶的+,所以将*放入栈内。

此时输出为:ab

栈的情况为:+*

5、继续遍历,遇到c,直接将其输出。

此时输出为:abc

栈的情况为:+*

6、继续遍历,遇到+,因为+的优先级低于栈顶的,故将弹出;然后新的栈顶元素的+与这个+优先级相同,故也要弹出现在栈顶的+;然后栈空了,将现在这个+放入栈中。

此时输出为:abc*+

栈的情况为:+

7、继续遍历,遇到(,直接将其放入栈中,不遇到)不会将(弹出。

此时输出为:abc*+

栈的情况为:+(

8、继续遍历,遇到d,直接将其输出。

此时输出为:abc*+d

栈的情况为:+(

9、继续遍历,遇到,因为栈顶为(,不遇到)不将(弹出,故直接将放入栈中。

此时输出为:abc*+d

栈的情况为:+(*

10、继续遍历,遇到e,直接将其输出。

此时输出为:abc*+de

栈的情况为:+(*

11、继续遍历,遇到+,因为+比栈顶的优先级低,故将弹出;新的栈顶元素为(,不遇到)不弹出(,故将+放入栈中。

此时输出为:abc+de

栈的情况为:+(+

12、继续遍历,遇到f,直接将其输出。

此时输出为:abc+def

栈的情况为:+(+

13、继续遍历,遇到),直接将栈中元素依次弹出并输出直到遇到(为止,注意:(弹出但不输出。

此时输出为:abc+def+

栈的情况为:+

14、继续遍历,遇到,因为的优先级大于栈顶元素+的优先级,故直接将*入栈。

此时输出为:abc+def+

栈的情况为:+*

15、继续遍历,遇到g,直接将其输出。

此时输出为:abc+def+g

栈的情况为:+*

16、继续遍历,为空,遍历结束。将栈内元素依次弹出。

此时输出为:abc+def+g*+

栈的情况为:空

//中缀表达式转后缀

#include<iostream>
#include<string>
#include<stack>

using namespace std;

int prio(char op) {                 //给运算符优先级排序
	int priority;
	if (op == '*' || op == '/')
		priority = 2;
	if (op == '+' || op == '-')
		priority = 1;
	if (op == '(')
		priority = 0;
	return priority;
}

bool Trans(string &str,string &str1) {   //引用传递
	stack<char> s;                   //定义一个char类型的栈s
	int i;
	for (i = 0; i<str.size(); i++) {
		if (str[i] >= '0' && str[i] <= '9') {    //如果是数字,直接入栈
			str1+=str[i];
		}
		else {                        //否则不是数字
			if (s.empty())            //栈空则入站
				s.push(str[i]);
			else if (str[i] == '(')   //左括号入栈
				s.push(str[i]);
			else if (str[i] == ')') {  //如果是右括号,只要栈顶不是左括号,就弹出并输出
				while (s.top() != '(') {  
					str1+= s.top();
					s.pop();
				}
				s.pop();                 //弹出左括号,但不输出
			}
			else {
				while (prio(str[i]) <= prio(s.top())) { //栈顶优先级大于等于当前运算符,则输出
					str1+= s.top();
					s.pop();
					if (s.empty())      //栈为空,停止
						break;
				}
				s.push(str[i]);   //把当前运算符入栈
			}
		}
	}
	while (!s.empty()) {      //最后,如果栈不空,则弹出所有元素并输出
		str1+= s.top();
		s.pop();
	}
	return true;
}

int main() {                //主程序
	string infix;
	string postfix;
	cout << "请输入中缀表达式:" << infix << endl;
	cin >> infix;
	Trans(infix,postfix);
	cout << "后缀表达式为:" << postfix << endl;
	return 1;
}
posted @ 2021-06-05 22:14  zonkidd  阅读(2567)  评论(0)    收藏  举报