20.有效的括号
思路:建一个栈存放括号
如果遇到左括号,就向栈内加对应的右括号
如果遇到右括号,就删除栈顶对应的右括号
一共有三种错误情况:
- 栈内最后不为空,即多加了左括号
- 发现不匹配的括号
- 字符串没遍历完,栈就空了。即多加了右括号
1047.删除字符串中的所有相邻重复项
使用栈。栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素
然后再去做对应的消除操作。 如动画所示:
从栈中弹出剩余元素,此时是字符串ac,因为从栈里弹出的元素是倒序的,所以在对字符串进行反转一下,就得到了最终的结果。
或者可以拿字符串直接作为栈,这样省去了栈还要转为字符串的操作。
150.逆波兰表达式求值
逆波兰表达式:是一种后缀表达式,所谓后缀就是指算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。
逆波兰表达式主要有以下两个优点:
- 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
- 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
逆波兰表达式相当于是二叉树中的后序遍历
思路:
遇见数字就加入到栈里,遇见操作符就从栈中取出元素做计算,再把数字加入到栈里
栈非常擅长做相邻字符这种消除的操作
这道题需要注意的是,num1是st.top(),num2是pop()之后的st.top(),我们应该是num2/num1,切记不要反了