1、20. 有效的括号
class Solution {
public boolean isValid(String s) {
//使用栈,(=>),[=>],{=>},出栈时要满足非空,栈的顶部与要出的相等
int len = s.length();
Stack<Character> stack = new Stack<>();
for(int i=0;i<len;i++){
char ch = s.charAt(i);
if(ch == '('){ //注意char是单引号
stack.push(')');
}else if(ch=='['){
stack.push(']');
}else if(ch=='{'){
stack.push('}');
}else if(!stack.isEmpty() && stack.peek() == ch){
//如果是右括号判断是否和栈顶元素匹配
//!stack.isEmpty()是防止遇到 "]"
stack.pop();
}else{
return false;
}
}
return stack.isEmpty();
}
}
2、1047. 删除字符串中的所有相邻重复项
class Solution {
public String removeDuplicates(String s) {
int len = s.length();
//进入前先判断peek是否相等,不等就插入
//相等则出
//最后剩下的则全部出栈
Stack<Character> stack = new Stack<>();
for(int i=0;i<len;i++){
char ch = s.charAt(i);
if(!stack.isEmpty()&&stack.peek() == ch){
stack.pop();
}else{
stack.push(ch);
}
}
//出栈
// StringBuilder sb = new StringBuilder();
// while(!stack.isEmpty()){
// sb.append(stack.pop());
// }
// return sb.toString();
String str = "";
while(!stack.isEmpty()){
str = stack.pop()+str;
}
return str;
}
}
3、150. 逆波兰表达式求值
class Solution {
public int evalRPN(String[] tokens) {
//使用堆栈,计算,注意减号和除号时的顺序
Stack<Integer> stack = new Stack<>();
for(int i=0;i<tokens.length;i++){
//找符号进行计算
String ch = tokens[i];
if(ch.equals("+")){
stack.push(stack.pop()+stack.pop());
}else if(ch.equals("*")){
stack.push(stack.pop()*stack.pop());
}else if(ch.equals("-")){
//注意:正常的temp1-temp2,使用栈时要相反
int temp1 = stack.pop(); //后进的
int temp2 = stack.pop(); //先进的
stack.push(temp2-temp1);
}else if(ch.equals("/")){
//注意:正常的temp1-temp2,使用栈时要相反
int temp1 = stack.pop(); //后进的
int temp2 = stack.pop(); //先进的
stack.push(temp2/temp1);
}else{
stack.push(Integer.valueOf(ch));
}
}
return stack.pop();
}
}
注意减和除的操作