前两天收到了一个作业题,讲的是把中序表达式表示成逆向波兰表达式,但是没理解,按照网上的方法做了下,搞了半天,发现总差一点,检查了一下代码,发现是在比较操作符优先级时出错了
下面对它的完整考虑方法
读入的括号必须是英文状态下的!
其算法的完整思路应该是:
- 当轮到的a[i]的是数子时,直接输出出来;
- 当读取的是运算符时,不直接输出,先入栈存储(存储是针对栈中无其他运算符),然后进行优先级的比较:
1)如果该运算符的优先级比栈顶元素(即运算符或者左括号,这个之后再说)的要高,那么就入栈;
2)如果该运算符的优先级没有栈顶的高,那么栈顶的操作符就输出来并出栈,再接着拿当前栈顶操作符的优先级与待入栈的元素a[i]进行比较,以此类推;直到,,,,(第三步)
3.如果读取到的运算符为“(”,那么就直接入栈存储;
4.如果读取到的运算符为“)”,那么直接输出栈中元素,并从栈中弹出运算符,直到遇到“(”,“(”和“)”不用输出;
5.当字符串全部读取过一遍后,将栈中的运算符按序全部输出再弹出(除了“(”),直到!s.empty()的值为假
在写主要代码之前,我们先看一下定义运算符优先级的代码:
int priority(char ch)
{
if (ch == '*' || ch == '/')
return 1;
if (ch == '+' || ch == '-')
return 0;
if (ch == '(')
re