中缀表达式X=A+B*(C-(D+F))/E转后缀表达式之后是什么?
ABCDF+-*E/+
ABDF+C-*E/+
ABDF+C*-E/+
ABCDF+-*E/+
ABDF+C-*E/+
ABDF+C*-E/+
ABDF+C*-E+/
中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
#include<iostream>
#include<string>
#include<stdlib.h>
#include<stack>
#include<map>
#include<vector>
using namespace std;
int type(char ch)
{
if (ch >= 'A'&&ch <= 'Z')return 1;
if (ch == '+' || ch == '-' || ch == '*' || ch == '/')return 0;
return -1;
}
int main()
{
string str = "A+B*(C-(D+F))/E";
map<char, int>priority;
stack<char>st;
string s;
priority.insert(make_pair('+', 0));
priority.insert(make_pair('-', 0));
priority.insert(make_pair('*', 1));
priority.insert(make_pair('/', 1));
priority.insert(make_pair('(', 2));
int i = 0;
while (i < str.length())
{
if (type(str[i]) == 1)s = s + str[i];
else if (type(str[i]) == 0)
{
if (st.empty())//还没有字符
{
st.push(str[i]);
}
else
{
while (1)
{
char ch = st.top();
if (ch == '(')
{
break;
}
if (priority[ch] >= priority[str[i]])//比将其优先级高的符号输出
{
s = s + ch;
st.pop();
}
else
{
break;
}
if (st.empty())break;
}
st.push(str[i]);
}
}
else if (type(str[i]) == -1)
{
if (str[i] == '(')st.push(str[i]);
else
{
while (1)
{
char ch = st.top();
if (ch != '(')
{
s = s + ch;
st.pop();
}
if (ch == '(')//找到配对的
{
st.pop();
break;
}
if (st.empty())break;
}
}
}
i++;
}
while (!st.empty())
{
s = s + st.top();
st.pop();
}
cout << s << endl;
return 0;
}