一、有效的括号
这道题主要是明确以下三种情况
首先判断字符串的长度是不是偶数,如果不是偶数那么就直接返回false,因为再怎么说也是成双成对的括号,
之后就是正常进入循环,如果匹配到有左括号的,直接把右括号压入栈
但是遇到不匹配的或者说要匹配栈中为空了,那这不行,要返回false
遇到相等的就直接压出栈
最后都匹配完事儿,再判断一下栈中是否为空,如果不为空还是返回的false
代码如下:
class Solution {
public boolean isValid(String s) {
Stack<Character> sta = new Stack<>();
if(s.length() % 2 != 0)
return false;
for(int i = 0;i<s.length();i++)
{
if(s.charAt(i) == '('){
sta.push(')');
}else if(s.charAt(i) == '{'){
sta.push('}');
}else if(s.charAt(i) == '['){
sta.push(']');
}else if(sta.isEmpty()||sta.peek()!=s.charAt(i)){
return false;
}
else sta.pop();
}
return sta.isEmpty();
}
}
二、1047删除字符串中的所有相邻重复项
这道题普及了很多的概念,比如说length()方法是String类的,size()方法是char类型 栈类型可以用的,然后charAt()方法是string字符串才可以用的,
创建字符串类可以使用ArrayList<Character> ch = new ArrayList<>();他往数组中添加元素是用ch.add(x)来添加的
创建动态的字符串数组,是用StringBuilder result = new StringBuilder(); 来创建的,他往字符串数组中添加元素是使用result.append(x)来添加的
然后增强for循环for(char ch:sta){ result.append(ch); } 还有就是要最后把StringBuilder的字符序列转换成字符串用return result.toString();
还有注意创建栈的时候返回的元素是char型的就是要用Stack<Character> sta = new Stack<>();
这道题和上一道题是差不多的思想,元素按顺序入栈,然后相邻的相同的元素入站的时候比较,相同就弹出,最后创建字符序列组来保存栈底到栈顶的字符,最后把字符序列转换成字符串返回
代码如下:
class Solution {
public String removeDuplicates(String s) {
Stack<Character> sta = new Stack<>();
if(s.length() == 0)
return "";
for(int i = 0;i<s.length();i++)
{
char ch1 = s.charAt(i);
if(!sta.isEmpty() && ch1 == sta.peek()){
sta.pop();
}else{
sta.push(ch1);
}
}
// ArrayList<Character> ch = new ArrayList<>();
StringBuilder str = new StringBuilder();
for(char ch:sta){
str.append(ch);
}
return str.toString();
}
}
三、150逆波兰表达式求值
这道题主要是明白这种计算是怎么做的,这道题后边可以用后序遍历二叉树(左右根)的方法,但是在这里可以用栈的方法,栈用在这里也是恰到好处,因为咱们只需要把那些字符数字放入栈里,然后遇到一个运算符就把栈顶前两个数进行运算操作,操作后的结果再压入栈中,最后返回栈顶的元素就是最终的结果
在做这道题的时候需要注意两个点:首先第一个点是咱们可以拿Deque<Integer> sta = new LinkedList<>()来模拟栈,也就是栈,他也有栈的那些方法
然后就是在最后将数字压入栈的时候,需要将字符串转换为整数,有两种方法可以进行转换
第一种是Integer类的parseInt的方法,这个返回的类型是int型
还有一种是Integer类的valueOf方法,这个返回的类型是Integer对象,是int型的包装类
然后还需要注意的就是字符串中匹配可以使用.equals()方法
代码如下:
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> sta = new LinkedList<>();
for(String str:tokens){
if("+".equals(str)){
sta.push(sta.pop()+sta.pop());
}else if("-".equals(str)){
sta.push(-sta.pop()+sta.pop());
}else if("*".equals(str)){
sta.push(sta.pop()*sta.pop());
}else if("/".equals(str)){
int a = sta.pop();
int b = sta.pop();
sta.push(b/a);
}else{
sta.push(Integer.parseInt(str));
}
}
return sta.pop();
}
}