20. 有效的括号 代码随想录
栈里面相当于放的是左括号,数目与左括号对应
有判空的条件一定先判断,防止操作空栈
class Solution {
public boolean isValid(String s) {
char[] ch = s.toCharArray();
Stack<Character> st = new Stack<>();
for(int i = 0; i < ch.length; i++){
if(ch[i] == '('){
st.push(')');
}else if(ch[i] == '{'){
st.push('}');
}else if(ch[i] == '['){
st.push(']');
}else if(st.empty()){//左右不匹配或右括号多了!!判空判断要往前放,防止操作空栈
return false;
} else if(ch[i] != st.peek()){//摊开
return false;
}else if(ch[i] == st.peek()){
st.pop();
}
}
return st.empty();//左括号多了
}
}
047. 删除字符串中的所有相邻重复项代码随想录
用栈存储并用String+号反转站内字符
class Solution {
public String removeDuplicates(String s) {
Stack<Character> st = new Stack<>();
char[] ch = s.toCharArray();
for(int i = 0; i < s.length(); i++){
if(st.empty() || ch[i] != st.peek()){
st.push(ch[i]);
}else if(ch[i] == st.peek()){
st.pop();
}
}
String res = "";
while(!st.empty()){
res = st.pop() + res;//StringBuider无法调整顺序
}
return res;
}
}
用字符串模拟栈的行为
class Solution {
public String removeDuplicates(String s) {
StringBuilder res = new StringBuilder();
int peek = -1;//拿字符串当栈,peek指针模拟栈顶位置,StringBuilder索引也是从0开始的
for(int i = 0; i < s.length(); i++){
if(peek == -1 || res.charAt(peek) != s.charAt(i)){
res.append(s.charAt(i));
peek++;
}else if(res.charAt(peek) == s.charAt(i)){
res.deleteCharAt(peek);
peek--;
}
}
return res.toString();
}
}
150. 逆波兰表达式求值 代码随想录
逆波兰 - 上(中缀表达式 转 后缀表达式)_哔哩哔哩_bilibili
逆波兰 - 下(后缀表达式计算结果)_哔哩哔哩_bilibili
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> st = new Stack<>();
for(String s : tokens){
if(s.equals("+")){
st.push(st.pop() + st.pop());
}else if(s.equals("-")){
st.push(-st.pop() + st.pop());//减法注意栈顶元素是减数
}else if(s.equals("*")){
st.push(st.pop() * st.pop());
}else if(s.equals("/")){
int a = st.pop();
int b = st.pop();
st.push(b / a);//与减法类似
}else{
st.push(Integer.valueOf(s));
}
}
return st.pop();
}
}