20.有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
20.有效的括号题目链接
class Solution {
public boolean isValid(String s) {
Stack<Character> res = new Stack<>();
for(char c : s.toCharArray()){
if(c == '{') res.push('}');
else if(c == '[') res.push(']');
else if(c == '(') res.push(')'); //存相反符号!!
else{
if(!res.isEmpty() && res.peek() == c){
res.pop();
}
else return false;
}
}
return res.isEmpty();
}
}
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
通过栈来比较,代码用的是碰到左括号,存右括号,当然也可以用碰到左括号,存左括号。
1047. 删除字符串中的所有相邻重复项题目链接
class Solution {
public String removeDuplicates(String s) {
Stack<Character> res = new Stack<>();
for(char c : s.toCharArray()){
if(!res.isEmpty() && res.peek() == c){
res.pop(); //相等 则弹出上个存储的字符
continue; //并且跳过这次循环
}
else res.push(c);
}
String a = "";
while(!res.isEmpty()){
a = res.pop() + a; //因为栈pop是弹出栈顶元素,所以顺序是反过来的
}
return a;
}
}
跟上一题类似,只是最后转换成String,需要注意栈的弹出元素顺序。
150. 逆波兰表达式求值题目链接
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> res = new Stack<>();
for(String s : tokens){
if(s.equals("+")|| s.equals("-") || s.equals("*") || s.equals("/")){
char c = s.charAt(0);
int temp1 = res.pop();
int temp2 = res.pop();
if(c == '+') res.push(temp1 + temp2);
else if( c == '-') res.push(temp2 - temp1);
else if(c == '/') res.push(temp2 / temp1);
else if(c == '*') res.push(temp2 * temp1);
}else{
res.push(Integer.valueOf(s));
}
}
return res.pop();
}
}
需要注意:减法和除法是反过来的,