目录
20.有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
class Solution {
public boolean isValid(String s) {
int len = s.length(),i = 0;
if (len%2 != 0)
return false;
Deque<Character> stack = new LinkedList<>();
HashMap<Character, Character> hm = new HashMap<>();
hm.put(')','(');
hm.put(']','[');
hm.put('}','{');
while (i<s.length()) {
char c = s.charAt(i);
if (c == '(' || c == '[' || c == '{')
stack.push(c);
else {
if (hm.get(c) == stack.peek())
stack.poll();
else
return false;
}
i++;
}
return stack.isEmpty();
}
}
155.最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。
class MinStack {
Deque<Integer> stack1 = new LinkedList<>();
Deque<Integer> stack2 = new LinkedList<>();
public MinStack() {
}
public void push(int val) {
stack1.push(val);
if (stack2.isEmpty() || val < stack2.peek()) {
stack2.push(val);
} else {
stack2.push(stack2.peek());
}
}
public void pop() {
stack1.pop();
stack2.pop();
}
public int top() {
return stack1.peek();
}
public int getMin() {
return stack2.peek();
}
}
225.用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
class MyStack {
Deque<Integer> q;
public MyStack() {
q = new LinkedList<>();
}
public void push(int x) {
q.offer(x);
}
public int pop() {
for(int i = 0;i < q.size() - 1;i++){
q.offer(q.poll());
}
return q.poll();
}
public int top() {
for(int i = 0;i < q.size() - 1;i++){
q.offer(q.poll());
}
int res = q.poll();
q.offer(res);
return res;
}
public boolean empty() {
return q.size() == 0;
}
}
232.用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
class MyQueue {
Deque<Integer> s1;
Deque<Integer> s2;
public MyQueue() {
s1 = new LinkedList<>();
s2 = new LinkedList<>();
}
public void push(int x) {
s1.push(x);
}
public int pop() {
if (!s2.isEmpty())
return s2.pop();
while (!s1.isEmpty()){
s2.push(s1.pop());
}
return s2.pop();
}
public int peek() {
if (!s2.isEmpty())
return s2.peek();
while (!s1.isEmpty()){
s2.push(s1.pop());
}
return s2.peek();
}
public boolean empty() {
return s1.isEmpty()&&s2.isEmpty();
}
}