2023.3.25 有效的括号
首先,有效括号的正确形势应该是唯一的。即左括号在前面,且左括号对应了一个右括号
我们可以遍历字符串s的字符,如果是左边括号,我们将其对应的右边括号放入栈中。当检测到当前字符不为左边括号时,我们可以pop()出栈顶元素看其是否与我们的字符对应,如果不对应则代表不匹配,返回false,此外,如果还在遍历过程中栈已经为空,代表数量不匹配,也返回false。当结束循环时,我们的栈应该为空,否则也代表数量不匹配。
stack.push(')');
}
else if(c == '{'){
stack.push('}');
}
else if(c == '['){
stack.push(']');
}
//当字符不为左括号,我们从栈中pop出栈顶元素与之对比,此外,还要检查当前的栈是否为空,如果为空,代表左括号数目少于右括号数目.
//注意这里的顺序,应该是选判断是否为空,再从栈顶中取出元素
else if( stack.isEmpty() || c != stack.pop() ){
return false;
}
}
//结束循环,我们也要判断栈是否为空,如果栈此时还不为空,代表左括号数目多于右括号数目,返回false
return stack.isEmpty();
}
}
2023.3.25 删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
使用栈来实现删除操作。因为栈可以记录上一个元素时什么,因此可以和当前元素进行对比,检测到相同就执行删除操作。
class Solution {
public String removeDuplicates(String s) {
Deque<Character> stack = new ArrayDeque<>();
for(char c : s.toCharArray()){
if(stack.isEmpty() || stack.peek() != c){
stack.push(c);
}
else if(stack.peek() == c){
stack.pop();
}
}
StringBuilder sb = new StringBuilder();
while(stack.peek() != null){
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}
2023.3.25 逆波兰表达式求值
逆波兰表达式的概念
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new ArrayDeque<>();
for(String s : tokens){
if("+".equals(s)){
int res = stack.pop()+stack.pop();
stack.push(res);
}
else if("-".equals(s)){
int res = -stack.pop() + stack.pop();
stack.push(res);
}
else if ("*".equals(s)){
int res = stack.pop() * stack.pop();
stack.push(res);
}
else if("/".equals(s)){
int first = stack.pop();
int second = stack.pop();
int res = second / first;
stack.push(res);
}
else{//数字,直接入栈
stack.push(Integer.parseInt(s));
}
}
//结束循环,此时栈应该只有一个元素
return stack.pop();
}
}