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;}

 

 

  • 输出文件

  • 输入后果