学习目标:
1.栈的经典应用
2.用栈求解后缀表达式
1.有效的括号
这道题主要考察的是对栈的理解,这道题的思路是: 从左到右遍历字符串,遇到是左括号的就将他的右括号放入栈中,遇到右括号就弹出括号,如果弹出的括号匹配不上,那么就是无效的括号。
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char temp = s.charAt(i);
if (temp == '(') stack.push(')');
else if (temp == '{') stack.push('}');
else if (temp == '[') stack.push(']');
else if (stack.isEmpty() || stack.peek() != temp){
return false;
}else stack.pop();
}
return stack.isEmpty();
}
}
2.删除字符串中的所有相邻重复项
用字符串模拟栈
class Solution {
public String removeDuplicates(String s) {
StringBuffer res = new StringBuffer();
int top = -1;
for (int i = 0; i < s.length(); i++) {
if(top >= 0 && res.charAt(top) == s.charAt(i)){
res.deleteCharAt(top);
top--;
}else{
res.append(s.charAt(i));
top++;
}
}
return res.toString();
}
}
3.后缀表达式求值
这道题用到了栈的性质,因为后缀表达式的求法是遇到数字就加入栈中,遇到计算符就弹出前两个数进行计算,算出来的结果就再放进栈中,最后栈中的那个数就是答案。
这里耍小聪明把一堆if换成了switch,好像并没有美观多少。
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < tokens.length; i++) {
if(stack.size() >1 && define(tokens[i]) > 0){
switch (define(tokens[i])){
case 1 :
stack.push(stack.pop() + stack.pop());
break;
case 2:
stack.push(-stack.pop() + stack.pop());
break;
case 3:
stack.push(stack.pop() * stack.pop());
break;
case 4:
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2/temp1);
break;
}
}else stack.push(Integer.parseInt(tokens[i]));
}
return stack.pop();
}
public int define(String c){
if(c .equals("+")) return 1;
else if (c .equals("-")) return 2;
else if (c .equals("*")) return 3;
else if (c .equals("/")) return 4;
else return -1;
}
}