学习笔记

时日不多了,好好珍惜OI的时光。

### 逆波兰表达式 

实质上就是中缀的后序遍历,把运算的优先给简化了,就是读到运算符的话就把栈顶的两个数出栈进行操作就好了,之后把结果再压进栈中。

比如3*(5–2)+7 就是 3 5 2 - * 7 +;4 + 2 * 5 - 7 / 11 就是 4 2 5 * + 7 -;

我们发现他的特性就是数字的顺序未变,变的只是符号的位置。而这种表达式的运算就是找到最近的运算符进行操作。所以说它是没有优先级的。

练习:luogu1449

那怎么转呢?

实际上还是利用栈。是数字的话就输出,是左括号的话就压进来,是右括号就弹出栈顶直到右括号。普通运算符就是如果栈顶优先级比当前大,那就输出,否则就压进去。最后栈中还有其他元素就弹出输出。

说白了,就是维护一个运算符优先级单调栈,右括号为-inf,读到左括号弹栈而已。

其实逆波兰表达式就是给表达式求值用的,计算器就是用的这个算法。

先把中缀转成逆波兰,再求值就ok了。快又稳。

练习:luogu 1981、1175;hdu 1237 

posted @ 2019-08-28 11:35  Simples2004  阅读(89)  评论(0)    收藏  举报