这几道题都是栈的应用场景
20:
最开始的思路是将String转换为字符数组,用一个新的字符数组存储单索引的值,再循环判断原字符数组双索引值处是否与单索引处值一致。
输入: "{[]}"
输出: true
这种在上面这种场景下就是有问题的。
括号匹配是使用栈解决的经典问题。
有哪些不匹配的场景:左边多-栈里留有剩余,右边多-栈为空但还没遍历完,类型匹配不上-栈里元素不匹配。
步骤,遇到左括号把右括号放进栈里,遇到右括号开始匹配。
剪枝:字符串长度为奇数,直接返回。
public boolean isValid(String s) {
int len=s.length();
if(len%2!=0){
return false;
}
Stack<Character> st = new Stack<>();
char ch;
for(int i=0;i<len;i++){
ch=s.charAt(i);
if(ch=='('){
st.push(')');
}else if(ch=='{'){
st.push('}');
}else if(ch=='['){
st.push(']');
}else if(st.isEmpty()||st.peek()!=ch){
return false;
}else{
st.pop();
}
}
return st.isEmpty();
}
1047:栈为什么适合做类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。知道了用栈做算是A了一道简单题。
public String removeDuplicates(String s) {
int len=s.length();
char ch;
Stack<Character> st = new Stack<>();
StringBuilder sb=new StringBuilder();
for(int i=0;i<len;i++){
ch=s.charAt(i);
if(!st.isEmpty()&&st.peek()==ch){
st.pop();
}else{
st.push(ch);
}
}
while(!st.isEmpty()){
sb.append(st.pop());
}
return new String(sb.reverse());
}
150:
逆波兰表达式主要有以下两个优点:
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
类似于二叉树的后序遍历,对计算机友好。
public int evalRPN(String[] tokens) {
Stack<Integer> st = new Stack<>();
for(String s:tokens){
if("+".equals(s)||"-".equals(s)||"*".equals(s)||"/".equals(s)){
int num1=(int)st.pop();
int num2=(int)st.pop();
if("+".equals(s)){
st.push(num1+num2);
}else if("-".equals(s)){
st.push(num2-num1);
}else if("*".equals(s)){
st.push(num1*num2);
}else{
st.push(num2/num1);
}
}else{
st.push(Integer.valueOf(s));
}
}
return st.pop();
}