力扣题目 20 有效的括号
class Solution {
public boolean isValid(String s) {
Deque<Character> deque = new LinkedList<>();
//如果长度为奇数,那么一定不对
if((s.length() % 2) != 0){ return false; }
for(int i = 0 ; i < s.length() ; i++){
char ch = s.charAt(i);
if(ch == '('){
deque.push(')');
}else if( ch == '{'){
deque.push('}');
}else if( ch == '['){
deque.push(']');
}
//这时出现的可能是右括号,队列为空和判断栈里有没有匹配的
else if( deque.isEmpty() || deque.peek() != ch){
return false;
}else{
deque.pop();
}
}
return deque.isEmpty();
}
}
力扣题目 1047 删除字符串中的所有相邻重复项
class Solution {
public String removeDuplicates(String s) {
int length = s.length();
//Deque<Character> deque = new LinkedList<>();
//ArrayDeque会比LinkedList在除了删除元素这一点外会快一点
ArrayDeque<Character> deque = new ArrayDeque<>();
char ch ;
for(int i = 0; i < length ; i++){
ch = s.charAt(i);
if( deque.isEmpty() || ch != deque.peek() ){
deque.push(ch);
}else{
deque.pop();
//i--;
}
}
String str = "";
while(!deque.isEmpty()){
str = deque.pop() + str;
}
return str;
}
}
这里注意先判断为不为空先,不然会报错
先 isEmpty() 然后再 peek()
回想一下,类似这样重复的是否也可以用双指针实现?
Of Course!那么怎么做?直接删除吗?那要怎么删除呢?用肯定是用快慢指针,不是左右指针。那么快慢指针怎么走呢?
当快指针与慢指针相同的时候,可以将快指针的值直接覆盖慢指针的值,然后快指针继续往后走,慢指针后退一个;不相同时候直接往后两个同时往后走
力扣题目 150 逆波兰表达式求值
(栈适合做相邻字符的消除操作)
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList();
for(String s : tokens){
if("+".equals(s)){
stack.push(stack.pop() + stack.pop());
}else if("-".equals(s)){
//注意减数与被减数的位置
stack.push(-stack.pop() + stack.pop());
}else if("*".equals(s)){
stack.push( stack.pop() * stack.pop());
}else if("/".equals(s)){
//这里也需要注意除数与被除数的位置
//不像减数那样可以加一个负号,所以需要设两个临时值
int temp1 = stack.pop(); //除数
int temp2 = stack.pop(); //被除数
stack.push(temp2 / temp1);
}else{
//这里注意储存值得类型,s是字符串,而栈是整型
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}