//中缀表达式转后缀表达式
//思路参考:https://blog.csdn.net/Amentos/article/details/127182926?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169536971416777224454965%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169536971416777224454965&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-127182926-null-null.142^v94^insert_down28v1&utm_term=%E4%B8%AD%E7%BC%80%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%BD%AC%E5%90%8E%E7%BC%80&spm=1018.2226.3001.4187
/*
* 首先先读入字符串
* 如果遇到数字,直接输出
* 遇到符号,如果栈里是比自己优先级低的,直接压栈
* 如果栈里是比自己优先级高的,则要先出栈,然后再压栈
* (号就像是一个堤坝,没有遇到')'之前,可以类比为栈底
*/
#include <iostream>
#include <string>
#include <stack>
using namespace std;
stack<char> S;
int main()
{
string str;
getline(cin, str);
int i = 0;
while (str[i]!='\x00')
{
switch (str[i])
{
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{
cout << str[i]<<" ";
i++;
break;
}
case '+':
{
while (!S.empty()&&S.top() != '(')
{
cout << S.top() << " ";
S.pop();
}
S.push(str[i]);
i++;
break;
}
case '-':
{
while (!S.empty()&&S.top()!='(')
{
cout << S.top() << " ";
S.pop();
}
S.push(str[i]);
i++;
break;
}
case '*':
{
if (!S.empty())
{
while (S.top() == '/' && S.top() == '*')
{
cout << S.top() << " ";
S.pop();
}
}
S.push(str[i]);
i++;
break;
}
case '/':
{
if (!S.empty())
{
while (S.top() == '/' && S.top() == '*'&&S.top()!='(')
{
cout << S.top() << " ";
S.pop();
}
}
S.push(str[i]);
i++;
break;
}
case '(':
{
S.push(str[i]);
i++;
break;
}
case ')':
{
while (S.top() != '(')
{
cout << S.top() << " ";
S.pop();
}
S.pop();
i++;
break;
}
}
}
while (!S.empty())
{
cout << S.top() << " ";
S.pop();
}
return 0;
}
【栈】中缀表达式转后缀表达式
最新推荐文章于 2024-05-20 23:51:15 发布