栈与队列的应用
相关题目
● 20. 有效的括号
● 1047. 删除字符串中的所有相邻重复项
● 150. 逆波兰表达式求值
有效的括号
实现思路
括号匹配分以为四种情况:
- 左括号存在,但右括号不存在
- 左括号存在,右括号存在,且是一对
- 左括号存在,右括号存在,但不是一对
- 左括号不存在,右括号存在
对于以上四种情况,使用栈判断如下:
- 左括号存在,但右括号不存在:字符串遍历完成后,栈不为空
- 左括号存在,右括号存在,且是一对:所有括号匹配成功,且栈为空
- 左括号存在,右括号存在,但不是一对:至少有一对括号匹配不成功
- 左括号不存在,右括号存在:栈为空,但字符串未遍历完成
实现过程
遇左括号入栈;
遇右括号,判断栈是否为空,栈为空时,返回false(情况4);栈不为空时与栈顶元素匹配,匹配成功,栈顶元素出栈(情况2);匹配不成功,返回false(情况3)
字符串遍历完成:判断栈是否为空:栈空,匹配完成,栈不空,返回false(情况1)
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char[] chars = s.toCharArray();
int i = 0;
while (i < chars.length) {
if (chars[i] == '(' || chars[i] == '[' || chars[i] == '{') {
stack.push(chars[i]);
} else if (stack.empty() && (chars[i] == '}' || chars[i] == ']' || chars[i] == ')')) {
return false;
} else if (!stack.empty() && (chars[i] == ')' && stack.peek() == '(') || (chars[i] == ']' && stack.peek() == '[') || (chars[i] == '}' && stack.peek() == '{')) {
stack.pop();
} else {
return false;
}
i++;
}
if (!stack.empty()) {
return false;
}
return true;
}
删除字符串中的所有相邻重复项
力扣链接
实现思路
使用栈解题。
遍历整个字符串各个元素,后一个元素先于前一个元素,即栈顶元素进行比较,元素相同,栈顶元素出栈;不相同,元素入栈,继续遍历
遍历完成后,依次pop出栈顶元素,并从后向前存入新字符数组中,最后返回字字符数组组成的字符串即可
实现过程
public static String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
char[] chars = s.toCharArray();
if(chars.length == 0){
return null;
}
stack.push(chars[0]);
for (int i = 1; i < chars.length; i++) {
if(!stack.empty() && chars[i] == stack.peek()){
stack.pop();
}
else {
stack.push(chars[i]);
}
}
if(stack.size() == 0){
return null;
}
char[] newchars = new char[stack.size()];
for (int i = stack.size()-1; i >=0 ; i--) {
newchars[i] = stack.pop();
}
return new String(newchars);
}
逆波兰表达式求值
力扣链接
实现思路
遍历字符串数组:遇到数字压栈,遇到算数运算符,栈顶前两个元素依次出栈(注意栈顶元素计算顺序)
实现过程
public static int evalRPN(String[] tokens) {
Stack<String> stack = new Stack<>();
for (int i = 0; i < tokens.length; i++) {
if (!tokens[i].equals("+") && !tokens[i].equals("-") && !tokens[i].equals("*") && !tokens[i].equals("/")) {
stack.push(tokens[i]);
} else if (!stack.empty()) {
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
if (tokens[i].equals("+")) {
stack.push(b + a + "");
} else if (tokens[i].equals("-")) {
stack.push(b - a + "");
} else if (tokens[i].equals("*")) {
stack.push(b * a + "");
} else if (tokens[i].equals("/")) {
stack.push(b / a + "");
}
}
}
return Integer.parseInt(stack.pop());
}
难点:将字符串转化为整数:Integer.valueOf(String s) 或Integer.parseInt(String s)