目录
155.最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。示例:
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]输出:
[null,null,null,null,-3,null,0,-2]解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
提示:
pop、top 和 getMin 操作总是在 非空栈 上调用。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
class MinStack {
/** initialize your data structure here. */
private Stack<Integer> data= null;
private Stack<Integer> min = null;
public MinStack() {
data = new Stack();
min = new Stack();
}
public void push(int x) {
data.push(x);
if(min.empty()){
min.push(x);
}else{
if(x<min.peek()){
min.push(x);
}else{
min.push(min.peek());
}
}
}
public void pop() {
data.pop();
min.pop();
}
public int top() {
return data.peek();
}
public int getMin() {
return min.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
225.用队列实现栈
使用队列实现栈的下列操作:
push(x) -- 元素 x 入栈
pop() -- 移除栈顶元素
top() -- 获取栈顶元素
empty() -- 返回栈是否为空
注意:你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。
你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-stack-using-queues
class MyStack {
/** Initialize your data structure here. */
private ArrayDeque<Integer> queue1 = null;
private ArrayDeque<Integer> queue2 = null;
public MyStack() {
queue1 = new ArrayDeque();
queue2 = new ArrayDeque();
}
/** Push element x onto stack. */
public void push(int x) {
if(queue1.isEmpty()){
queue2.offer(x);
}else{
queue1.offer(x);
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
if(queue1.isEmpty()){
while(queue2.size()!=1){
queue1.offer(queue2.poll());
}
return queue2.poll();
}else{
while(queue1.size()!=1){
queue2.offer(queue1.poll());
}
return queue1.poll();
}
}
/** Get the top element. */
public int top() {
if(queue1.isEmpty()){
while(queue2.size()!=1){
queue1.offer(queue2.poll());
}
return queue2.peek();
}else{
while(queue1.size()!=1){
queue2.offer(queue1.poll());
}
return queue1.peek();
}
}
/** Returns whether the stack is empty. */
public boolean empty() {
return queue1.isEmpty()&&queue2.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
232.用栈实现队列
使用栈实现队列的下列操作:
push(x) -- 将一个元素放入队列的尾部。
pop() -- 从队列首部移除元素。
peek() -- 返回队列首部的元素。
empty() -- 返回队列是否为空。
示例:MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-queue-using-stacks
class MyQueue {
/** Initialize your data structure here. */
private Stack<Integer> stack1 = null;
private Stack<Integer> stack2 = null;
public MyQueue() {
stack1 = new Stack();
stack2 = new Stack();
}
/** Push element x to the back of queue. */
public void push(int x) {
stack1.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
if(!stack2.isEmpty()){
return stack2.pop();
}else{
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
/** Get the front element. */
public int peek() {
if(!stack2.isEmpty()){
return stack2.peek();
}else{
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
return stack2.peek();
}
}
/** Returns whether the queue is empty. */
public boolean empty() {
return stack1.isEmpty()&&stack2.isEmpty();
}
}
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.empty();
*/