有效的括号 LeetCode 20
题目链接:[LeetCode 20 - 简单]
思路
碰到"(" "[" "{" ,在栈中插入相应的另一半。如果碰到后半部分,则栈中元素判断是否相等,并弹出。
Deque:
class Solution {
public boolean isValid(String s) {
char ch;
Deque<Character> deque = new LinkedList<>();
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();
}
}
总结
分析一共有三种情况: 1.遍历完字符串但是栈里面非空 -> 左括号多,return false 2.遍历完字符串的过程中,栈里面空了 -> 右括号多,return false 3.遍历完所有数组,栈里面没有对应的字符 -> return false
删除字符串中的所有相邻重复项 LeetCode 1047
题目链接:[LeetCode 1047 - 简单]
思路
使用栈来解决匹配问题。
ArrayDeque:
class Solution {
public String removeDuplicates(String s) {
ArrayDeque<Character> deque = new ArrayDeque<>();
char ch;
for(int i=0;i<s.length();i++){
ch = s.charAt(i);
if(deque.isEmpty() || deque.peek()!=ch){
deque.push(ch);
}else{
deque.pop();
}
}
String str="";
while(!deque.isEmpty()){
str = deque.pop() + str;
}
return str;
}
}
总结
1.使用str = deque.pop() + str;而不是str += deque.pop();的原因为,栈具有先进后出的特性。 2.更高效的题解:
class Solution {
public String removeDuplicates(String s) {
char[] cs = s.toCharArray();
int index = 0;
for(int i = 0; i < cs.length; i++){
cs[index] = cs[i];
if(index > 0 && cs[index] == cs[index-1]){
index--;
}else{
index++;
}
}
return new String(cs,0,index);
}
}
逆波兰表达式求值 LeetCode 150
题目链接:[LeetCode 150 - 中等]
思路
使用栈来解决匹配问题。
ArrayDeque:
class Solution {
public int evalRPN(String[] tokens) {
ArrayDeque<Integer> deque = new ArrayDeque<>();
String ch;
int num1=0,num2=0;
for(int i=0;i<tokens.length;i++){
ch = tokens[i];
if(!deque.isEmpty() && "+".equals(ch)){
num1 = deque.pop();
num2 = deque.pop();
deque.push(num1+num2);
}else if(!deque.isEmpty() && "-".equals(ch)){
num1 = deque.pop();
num2 = deque.pop();
deque.push(-num1+num2);
}else if(!deque.isEmpty() && "*".equals(ch)){
num1 = deque.pop();
num2 = deque.pop();
deque.push(num1*num2);
}else if(!deque.isEmpty() && "/".equals(ch)){
num1 = deque.pop();
num2 = deque.pop();
deque.push(num2/num1);
}else{
deque.push(Integer.valueOf(ch));
}
}
return deque.pop();
}
}
总结
1.为什么使用"-".equals(ch)而不是== :在使用+和*的方法时==会发生错误,发生错误的原因是? 2.num1和num2的顺序问题:-时,num1减数,num2为被减数 -> num2-num1 /时,num1为除数,num2为被除数,num2/num1