实现的问题:输入一个中缀表达式,转换为对应的后缀表达式,并输出;
【注】这里所输入分中缀表达式字符间无空格,若有空格,请自行修改代码【注】
中缀表达式转后缀表达式,基本思想为,扫描遍历所输入的字符串,遇到数字则直接输出,遇到字符则要相应判断:
(1)若为‘(’,则直接入栈;
(2)若为')',则将栈顶元素输出,直到栈顶元素为‘(',最后将左括号出栈但并不输出【注】后缀表达式中不应该出现括号【注】 ;
(3)若为运算符,则判断其与栈顶元素的优先级大小,若栈顶元素优先级较大,则输出比此时操作符优先级大或相等的所有栈顶元素【注】这里所采用的是递归判断栈顶元素优先级,即每出栈一个栈顶元素,都要判断新栈顶元素与此时操作符的优先级大小【注】,反之将此时操作符入栈;
具体代码如下:
#include<bits/stdc++.h>
using namespace std;
int yxj(char c) //优先级定义
{
if (c == '-' || c == '+')
return 1;
if (c == '*' || c == '/')
return 2;
return 3;
}
int panduan(stack<char> &ss,char c)
{
if (ss.empty()) //栈空则直接入栈
ss.push(c);
else if (c == '(')
{
ss.push(c);
}
else if (c == ')')
{
while (ss.top() != '(')
{
cout << ss.top();
ss.pop();
}
ss.pop();
}
else//栈不为空
{
if (yxj(c) < yxj(ss.top()) || yxj(c) == yxj(ss.top()))//若此时操作符的优先级<=栈顶操作符优先级,则将栈顶操作符输出,出栈,将此时操作符入栈
{
if (ss.top() != '(') {
cout << ss.top();
ss.pop();
return panduan(ss, c); //将所有优先级高与此时操作符的栈内操作符都输出
}
if (ss.top() == '(') {
ss.push(c);
return 0;
}
}
else //此时操作符优先级高于栈顶操作符优先级,入栈
{
ss.push(c);
return 0;
}
}
}
int main()
{
string s;
stack<char> ss; //操作符栈
while (cin >> s)
{
for (char c : s)
{
if (isdigit(c) != 0) //c是数字
{
cout << c;
}
else
{
panduan(ss, c);
}
}
while (!ss.empty())
{
cout << ss.top();
ss.pop();
}
cout << endl;
}
return 0;
}