LeetCode 20 有效的括号
本题思路:利用栈来完成,如果遇到左括号类型就放入栈,如果遇到右括号类型,就弹出栈顶的元素和该元素进行匹配,如果不匹配就返回 false。
注意点:
- 第一个就是右括号类型,那么肯定是不匹配的,此时只需要判断栈元素是否为空,如果为空,直接返回 false;
- 只有一个左括号类型, 如果已经遍历到末尾,那么判断栈是否为空,如果为空则返回 true, 不空则返回 false
public boolean isValid(String s) {
Stack<Character> stack = new Stack();
char[] c = s.toCharArray();
int i = 0;
for (i = 0; i < c.length; i++) {
if (c[i] == '(' || c[i] == '{' || c[i] == '[') {
stack.push(c[i]);
} else {
// 栈不为空,才能匹配
if (!stack.isEmpty()) {
char pop = stack.pop();
if (c[i] == ')' && pop == '(') {
} else if (c[i] == '}' && pop == '{') {
} else if (c[i] == ']' && pop == '[') {
} else { // 如果不匹配
return false;
}
} else { // 栈为空,不匹配
return false;
}
}
}
if(stack.isEmpty()){
return true;
}
return false;
}
LeetCode 1047 删除字符串中的所有相邻重复项
本题思路: 利用一个栈来完成, 分为两步
- 再进入栈之前先判断是否为空,如果空的情况下直接就进栈
- 如果不为空,则判断当前元素和栈顶元素是否一样,如果一样,就弹出栈顶元素
为了方便理解,画一幅图来讲解一下示例
- 初始状态下,栈为空
- 根据上图,我们直接入栈即可
- 根据上图,此时栈不为空,b也不等于a,所以直接入栈
- 根据上图,此时不为空,但是b等于栈顶元素,所以弹出b
- 根据上图,此时栈不为空,但是a等于栈顶元素a,所以弹出a
- 根据上图,此时栈为空,直接入c即可
- 根据上图,此时栈不为空,并且a不等于c,直接入栈
- 最后返回所剩下的元素就是字符串,需要倒置一下顺序即可
class Solution {
public String removeDuplicates(String s) {
char[] array = s.toCharArray();
Stack<Character> stack = new Stack();
for(int i = 0; i < array.length; i++){
// 栈为空直接入
if(stack.isEmpty()){
stack.push(array[i]);
}else{ // 栈不为空的情况下,
char pop = stack.peek();
// 入栈前先判断栈顶元素是否和要入栈元素相同,如果相同就弹出栈顶元素
if(array[i] == pop){
stack.pop();
}else{
stack.push(array[i]);
}
}
}
char[] tmp = new char[stack.size()];
for(int i = tmp.length - 1; i >= 0 ; i--){
tmp[i] = stack.pop();
}
return new String(tmp);
}
}
LeetCode 150 逆波兰表达式求值
本题思路: 利用栈来完成
- 遇到数字就放入栈中
- 遇到符号,就弹出两位进行计算后,又放入栈中
- 最终剩下的一个元素就是就结果,弹出即可
class Solution {
public static int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack();
for (int i = 0; i < tokens.length; i++) {
if (isNumber(tokens[i])) {
stack.push(Integer.parseInt(tokens[i]));
} else { //
int a = stack.pop();
int b = stack.pop();
if (tokens[i].equals("+")) {
stack.push(a+b);
} else if (tokens[i].equals("-")) {
stack.push(b-a);
} else if (tokens[i].equals("*") ) {
stack.push(b*a);
} else {
stack.push(b/a);
}
}
}
int ans =stack.pop();
return ans;
}
public static boolean isNumber(String token) {
return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token));
}
}
注意点: 字符串比较一定要用 equals 来进行,不然就会出现错误异常!!