20有效的括号
import java.util.Stack;
public class day11_22_有效的括号 {
public static void main(String[] args) {
}
public boolean isValid(String s){
Stack<Character> temp=new Stack<>();
for(int i=0;i<s.length();i++){
if (s.charAt(i)=='(') {
temp.push(')');
}else if (s.charAt(i)=='{') {
temp.push(s.charAt(i));
}else if(s.charAt(i)=='['){
temp.push(s.charAt(i));
}else if(temp.isEmpty()||temp.peek()!=s.charAt(i)){
return false;
} else{
temp.pop();
}
}
return temp.isEmpty();
}
}
这题的大概是,遇到左边类型的就把匹配的 有括号入栈,然后当遍历到的不是左括号时候,就代表是有括号,根据规则,这时,栈的最上方的括号,应该和我们当前遍历到的有括号是相同的,所以,当此时 栈是空或者栈顶的匹配不上,就直接false,这里直接returbn了,如果匹配 的上,就把站定的pop出去,接着后面的遍历,然后如果全部遍历完毕了,就判断这时候的栈是不是空的,空的是符合题意的,不空就错,直接 false、
1047. 删除字符串中的所有相邻重复项
import java.util.Stack;
public class day11_1047_删除字符串中所有相邻重复项 {
public static void main(String[] args) {
}
public String removeDuplicates(String s) {
//用栈的思路很简单
//只要判断即将入栈的元素和栈顶是否相同就行,如果相同,不入栈,然后把栈顶pop,然后接着后面的遍历
Stack<Character>temp=new Stack<>();
StringBuffer str=new StringBuffer();
for(int i=0;i<s.length();i++){
if (!temp.isEmpty()&&s.charAt(i)==temp.peek()) {
temp.pop();
continue;
}
temp.push(s.charAt(i));
}
while (!temp.isEmpty()) {
str.append(temp.pop());
}
return str.reverse().toString();
}
}
思路不难,就是把入栈元素和栈顶的匹配一下,如果一样就出去,然后接着遍历
最后把栈里面的弹出去,并且翻转一下就ok
150. 逆波兰表达式求值
import java.util.Stack;
public class day11_150_逆波兰表达式求值 {
public static void main(String[] args) {
}
public int evalRPN(String[] tokens) {
Stack<Integer> result=new Stack<>();
for(String s : tokens){
switch(s){
case "+":
result.push(result.pop() + result.pop());
break;
case "*":
result.push(result.pop() * result.pop());
break;
case "-":
result.push(0 - result.pop() + result.pop());
break;
case "/":
int b = result.pop();
int a = result.pop();
result.push(a/b);
break;
default:
result.push(Integer.parseInt(s));
}
return result.pop();
}
}
}
今天都是简单题