1、遇到数值: 直接输出
2、遇到左括号:将左括号入栈
3、遇到右括号:将栈中的运算符依次出栈并输出, 直到第一次遇到左括号(该左括号出栈但不输出)。至此消除表达式中的一对括号
4、遇到四则运算符:栈中所有优先级大于或等于该四则运算符的运算符依次出栈并输出,然后将该运算符入栈
5、字符串遍历结束后如果栈不为空,则依次将操作符弹出并输出
#include <iostream>
#include <stack>
#include <map>
#include <string.h>
#include <stdlib.h>
#include <cstdio>
#define is_Operand str[i] >= '0' && str[i] <= '9' || str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z' //判断是否为操作数
#define is_Operator str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/' || str[i] == '%' || str[i] == '@' //判断是否为运算符
using namespace std;
string str; //中序输入串
char temp[100]; //后序逆波兰式
int t = 0; //后序逆波兰式的有效长度
void change()
{
stack<char> s; //用栈来临时存储转化过程中的变量
///用一个map来存储运算符优先级
//下标为字符,很有意思
map<char, int> p;
p['+'] = p['-'] = 1;
p['*'] = p['/'] = p['%'] = 2;
p['@'] = 3; //取反操作,单目运算。优先级最高
for (int i = 0; str[i] != '\0'; i++)
{
///首先略过空格
if (str[i] == ' ')
continue;
///遇到左括号
if (str[i] == '(')
s.push(str[i]);
///遇到右括号
else if (str[i] == ')')
{
while (!s.empty() && s.top() != '(')
{
cout << s.top() << " ";
s.pop();
}
s.pop();
}
///遇到操作数。支持多位整型数以及多位字符变量
else if (is_Operand)
{
cout << str[i];
i++;
int res = str[i];
//处理多位的情况
while (i < str.length() && is_Operand)
{
cout << str[i];
i++;
}
cout << " ";
i--;
}
///遇到运算符
else if (is_Operator)
{
while (!s.empty() && p[s.top()] >= p[str[i]])
{
cout << s.top() << " ";
s.pop();
}
s.push(str[i]);
}
///遇到非法符号
else
{
cout << "存在非法符号";
exit(0);
}
}
///输出剩余的操作符
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
}
int main()
{
freopen("b.txt", "r", stdin);
getline(cin, str);
change(); //将中缀式转化为后缀式
return 0;
}
输入文件
输出结果
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。