今日内容:
- 20. 有效的括号
- 1047. 删除字符串中的所有相邻重复项
- 150. 逆波兰表达式求值
LeetCode20 有效的括号
题目链接:20. 有效的括号
思路:由于栈结构的特殊性,非常适合做对称匹配类的题目(即有顺序的匹配)。
deque可以当栈使用(push、pop),也可以当队列使用(add、remove)(offer、poll)
push进对应的下括号,然后判断空或者有不重复项时false,不然就是在重复情况下pop出重复项
class Solution {
Deque<Character> q1 = new LinkedList<>();
public boolean isValid(String s) {
int size = s.length();
char ch;
for(int i=0;i<size;i++){
ch = s.charAt(i);
if(ch=='(') q1.push(')');
else if(ch=='{') q1.push('}');
else if(ch=='[') q1.push(']');
else if(q1.isEmpty() || q1.peek()!=ch){
return false;
}else{
q1.pop();
}
}
return true;
}
}
LeetCode1047 删除字符串中的相邻重复项
题目链接:1047. 删除字符串中的相邻重复项
思路:空或不存在重复时push,存在重复时pop出重复字母,最终留在栈中的就是非重复项
这道题还可以用其他两种做法,一种是直接用StringBuider类型的作为栈
另一种是用双指针法,参考。
class Solution {
Deque<Character> q1 = new LinkedList<>();
public String removeDuplicates(String s) {
int size = s.length();
for(int i=0;i<size;i++){
char ch = s.charAt(i);
if(q1.isEmpty() || q1.peek() != ch){
q1.push(ch);
}
else q1.pop();
}
//将栈中的字母逆序输出的一种方式
String str ="";
while(!q1.isEmpty()){
str = q1.pop() + str;
}
return str;
}
}
LeetCode150 逆波兰表达式求值
题目链接:150. 逆波兰表达式求值
我们平时使用的中缀表达式例如:4 + 13 / 5,对计算机十分不友好,转化为后缀表达式以后计算机可以利用栈来进行顺序处理,就很方便了
● ==与equals的区别:1. ==是一个关系运算符,对于基本数据类型会比较内部的值是否相等,但是对于“String”和“Integer”等引用数据类型,会比较两个对象的地址是否相等。所以这里用equals,比较对象的内容是否相等。
● String类型转化为int:方法①。Integer.parseInt(s);(只对String类型转化为int类型)
方法②。Integer.ValueOf(s).intValue;其中Integer.valueOf()可以将基本类型int或者将String转换成包装类型Integer,然后intValue把integer转化为int。
● 逆波兰表达式主要有以下两个优点:
-
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
-
适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList();
for (String s : tokens) {
if ("+".equals(s)) { // 不能使用==判断字符串是否相等
stack.push(stack.pop() + stack.pop()); // 注意 - 和/ 需要特殊处理
} else if ("-".equals(s)) {
stack.push(-stack.pop() + stack.pop());
} else if ("*".equals(s)) {
stack.push(stack.pop() * stack.pop());
} else if ("/".equals(s)) {
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2 / temp1);
} else {
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}