leetcode 20. 有效的括号
1)栈有后进先出的特性,在这题被用于检查与左括号的匹配情况。
2)当遇到左括号时,它将其推入栈中,然后当遇到右括号时,它会检查栈顶的左括号是否与当前右括号匹配。
3)当所有左括号都匹配,并且被移除,栈为空的情况下,为true。
class Solution {
public boolean isValid(String s) {
//create a stack to add left parentheses
Stack<Character> box = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '{' || c == '[') {
box.push(c);
} else {
if (!box.isEmpty() && leftOf(c) == box.peek()) {
box.pop();
} else {
return false;
}
}
}
return box.isEmpty();
}
public char leftOf(char c) {
if (c == ')') {
return '(';
}
if (c == '}') {
return '{';
}
return '[';
}
}
Leetcode 1047. 删除字符串中的所有相邻重复项
这个题很适合用栈来做,因为栈帮助我们记录并找到遍历数组当前元素时候,前一个元素是什么。
class Solution {
public String removeDuplicates(String s) {
//后进先出,判断相邻元素是否相等
if (s.length() == 1) {
return s;
}
Stack<Character> stack = new Stack<>();
for(char c : s.toCharArray()) {
if (!stack.isEmpty() && stack.peek() == c) {
stack.pop();
} else {
stack.push(c);
}
}
StringBuilder intoStr = new StringBuilder();
// while (!stack.isEmpty()) {
// intoStr.append(stack.pop());
// }
//不能这样通过while循环,将每个栈顶元素加到StringBuilder中,因为顺序就颠倒了
//s = "abbaca",这样结果为“ac”, 但是expected is "ca".
for (int i = 0; i < stack.size(); i++) {
intoStr.append(stack.get(i));
}
return intoStr.toString();
}
}
Leetcode 150. 逆波兰表达式求值 Evaluate Reverse Polish Notation
1)栈适合对相邻元素进行消除处理,这题其实是两个数字遇见一个操作符,做消除的操作。
2)遇见数字加到栈里,遇见操作符从栈里取出两个元素,两个数字进行操作符的加减乘除之后,再次加到栈里,最后结果就是栈里剩下的的最后一个元素。
3) 取元素时,先取出两个元素num1, 再取出第二个元素num2。加入是减操作,应该num2 - num1,因为按照先进后出原则,题目最先进去的元素对后进去的元素进行加减乘除。
栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList();
for (String s : tokens) {
if ("+".equals(s)) {
int num1 = stack.pop();
int num2 = stack.pop();
stack.push(num2 + num1);
} else if ("-".equals(s)) {
int num1 = stack.pop();
int num2 = stack.pop();
stack.push(num2 - num1);
} else if ("*".equals(s)) {
int num1 = stack.pop();
int num2 = stack.pop();
stack.push(num2 * num1);
} else if ("/".equals(s)) {
int num1 = stack.pop();
int num2 = stack.pop();
stack.push(num2 / num1);
} else {
//change element into Integer object,because return value is int type
stack.push(Integer.valueOf(s));
}
}
int result = stack.pop();
return result;
}
}