栈与队列
232.用栈实现队列
解题思路:
- 用两个栈模拟一个队列
- 一个入栈---当出栈时,将入栈的站内元素全部倒入出栈中,然后出栈,当出栈内为空时,就将入栈再倒一次,若两个栈都为空,则代表该队列为空
class MyQueue {
Deque<Integer> inputDeque;
Deque<Integer> outputDeque;
public MyQueue() {
inputDeque = new ArrayDeque<>();
outputDeque = new ArrayDeque<>();
}
public void push(int x) {
inputDeque.push(x);
}
public int pop() {
if(!outputDeque.isEmpty()){
return outputDeque.pop();
}else{
while(!inputDeque.isEmpty()){
outputDeque.push(inputDeque.pop());
}
return outputDeque.pop();
}
}
public int peek() {
if(!outputDeque.isEmpty()){
return outputDeque.peek();
}else{
while(!inputDeque.isEmpty()){
outputDeque.push(inputDeque.pop());
}
return outputDeque.peek();
}
}
public boolean empty() {
return inputDeque.isEmpty() && outputDeque.isEmpty();
}
}
225.用队列实现栈
用两个队列实现一个先入后出的栈:
- 其中一个队列入栈, 当需要出栈时候, 就将一个有元素的队列中的元素转到另外一个空队列中, 然后剩下最后一个用来查看或者弹出, 整个过程永远保证一个队列为空
class MyStack {
Deque<Integer> inputQueue;
Deque<Integer> outputQueue;
public MyStack() {
inputQueue = new ArrayDeque<>();
outputQueue = new ArrayDeque<>();
}
public void push(int x) {
if(inputQueue.isEmpty()){
outputQueue.offerLast(x);
}else{
inputQueue.offerLast(x);
}
}
public int pop() {
if(!inputQueue.isEmpty()){
while(inputQueue.size() > 1){
outputQueue.offerLast(inputQueue.pollFirst());
}
return inputQueue.pollFirst();
}else{
while(outputQueue.size() > 1){
inputQueue.offerLast(outputQueue.pollFirst());
}
return outputQueue.pollFirst();
}
}
public int top() {
if(!inputQueue.isEmpty()){
while(inputQueue.size() > 1){
outputQueue.offerLast(inputQueue.pollFirst());
}
int ans = inputQueue.peekFirst();
outputQueue.offerLast(inputQueue.pollFirst());
return ans;
}else{
while(outputQueue.size() > 1){
inputQueue.offerLast(outputQueue.pollFirst());
}
int ans = outputQueue.peekFirst();
inputQueue.offerLast(outputQueue.pollFirst());
return ans;
}
}
public boolean empty() {
return inputQueue.isEmpty() && outputQueue.isEmpty();
}
}