20. 有效的括号
思路
这种匹配题,尤其是括号匹配,最适合使用的数据结构就是栈,因为天生的只有入栈和出栈操作,对应左右括号的进出,所以我们使用栈来完成括号匹配
- 首先创建一个栈,来进行匹配操作
- 遍历字符串,当遇到左括号时,将对应的右括号压入栈中
- 当匹配到右括号,会取出栈顶元素进行比较,如果相同说明匹配成功;如果不同(括号顺序出现问题),或者匹配过程中栈为空了(说明已经没有对应的括号与之对应)。那就直接返回false;
- 最后判断栈是否为空,为空说明全部匹配成功,返回true;否则说明右括号不足,返回false
代码实现(java)
class Solution {
public boolean isValid(String s) {
if(s.isEmpty()) return true;
Stack<Character> stack = new Stack<>();
char[] chars = s.toCharArray();
for(char c : chars) {
if(c == '(') stack.push(')');
else if(c == '{') stack.push('}');
else if(c == '[') stack.push(']');
else if(stack.isEmpty() || c != stack.pop()) return false;
}
return stack.isEmpty();
}
}
232. 用栈实现队列
思路
使用两个栈来实现队列(先进先出)
我们可以在pop、peek操作时,如果第二个栈为空,将第一个栈中的元素转移到第二个栈中,这样就可以做到,先进来的元素在栈顶,之后操作第二个栈的栈顶就是完成了先进先出
代码实现(java)
class MyQueue {
Stack<Integer> in;
Stack<Integer> out;
public MyQueue() {
in = new Stack<>();
out = new Stack<>();
}
public void push(int x) {
in.add(x);
}
public int pop() {
if(out.isEmpty()) {
while(!in.isEmpty())
out.push(in.pop());
}
return out.pop();
}
public int peek() {
if(out.isEmpty()) {
while(!in.isEmpty())
out.push(in.pop());
}
return out.peek();
}
public boolean empty() {
return in.isEmpty() & out.isEmpty();
}
}