20.有效的括号
class Solution {
public boolean isValid(String s) {
Deque<Character> deque = new LinkedList<>();
Character ch;
for(int i = 0; i < s.length(); i++){
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) {
Deque<Character> deque = new LinkedList<>();
Deque<Character> deque2 = new LinkedList<>();
Character ch;
for(int i = 0; i < s.length(); i++){
ch = s.charAt(i);
if( !deque.isEmpty() && ch == deque.peek()){
deque.pop();
}else{
deque.push(ch);
}
}
while(!deque.isEmpty()){
deque2.push(deque.pop());
}
StringBuilder sb = new StringBuilder();
while(!deque2.isEmpty()){
sb.append(deque2.pop());
}
s = sb.toString();
return s;
}
}
关键是不要忘记弹掉已经压入栈内的重复元素。
解法中有一部分是可以更简单的,答案中deque解法只用了一个栈
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
str = deque.pop() + str 的话 弹出的元素就会在str的前部了
代码随想录解法
直接把字符串当栈, 只不过需要借助StringBuilder来实现增删(字符串具有不变性),要用到Stringbuilder的deleteCharAt。
class Solution {
public String removeDuplicates(String s) {
StringBuffer res = new StringBuffer();
int top = -1;
Character ch;
for(int i = 0; i < s.length();i++){
ch = s.charAt(i);
if(res.isEmpty() || res.charAt(top)!= ch) {
res.append(ch);
top++;
}else{
res.deleteCharAt(top);
top--;
}
}
return res.toString();
}
}
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{
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}