题目链接:https://pintia.cn/problem-sets/15/problems/827
参考:https://blog.csdn.net/SiKongPop/article/details/77972879#comments(内附数个测试样例)
题意:
将输入中缀表达式转换为后缀表达式,输入字符包含'+' '-' '*' '/' '(' ')'。输出的每个操作数或操作符用空格间隔开,并且末尾不能输出多余空格。
特别注意:操作数是可以有多位的,并且可以是小数,也就是说会包含有小数点,同时有的操作数是带符号的,带+号的不用输出+号,但是带-号的需要输出-号。
如果不把这些考虑进去注意,会有格式错误。
中缀到后缀的代码逻辑:
先准备一个栈S用来存储操作符,然后对输入的表达式的每个字符逐个处理。
对于输入的字符进行如下判断:
1)如果是'(',直接压入栈S。
2)如果是'*' '/' '+' '-',将S的栈顶出栈与输入的字符进行对比,如果输入操作符优先级小于等于栈顶操作符,则先输出栈顶操作符,再将输入的操作符压入栈S。
3)如果是')',S出栈,判断出栈的字符是不是'(',如果不是,则输出,否则,直接退出判断。
处理多位数,小数以及带符号数的方法:
1)首先要清楚什么地方会出现带符号的数,第一种情况是在输出结果的开头,比如“-2+1”,第二种情况是在括号里面,即紧接着'(',例如“(-2+1)”或者“(-2)+1”。
2)如果(1)的条件满足,则顺着下去判断,逐个判断接下来输入的字符,如果仍然是数字或者小数点,就接着输出,如果遇到了非数字和非小数点的字符,就结束输出(此时一个操作数的输出已经完成,可以进行下一个输入的操作符的判断。)
3)如果只是不带符号的数,那么也跟(2)一样,从第一个数字开始逐个判断下一个数,与(2)同理。
结果是如何输出的:
1)对于操作数,读入之后按要求处理后直接输出即可。
2)对于操作符,一部分是在操作符入栈时优先级比栈顶操作符低级(或与栈顶操作符平级)的时候将栈顶操作符输出,剩下一部分是在程序最后面,将剩下未出栈的操作符逐个出栈输出。
AC代码:
1 #include <iostream> 2 #include <string> 3 #include <cstring> 4 using namespace std; 5 6 class stack_//定义栈 7 { 8 public: 9 stack_() :r(-1) {} 10 ~stack_() {} 11 void push(char k) 12 { 13 s[++r] = k; 14 } 15 char pop() 16 { 17 if (r != -1) 18 return s[r--]; 19 else 20 return '