1、栈实现队列
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
两栈:输入栈和输出栈。
push():进输入栈。
pop():将输入栈输入的元素一次性倒进输出栈,再pop()即可实现队列的出。倒进时要全部进,不然顺序会混乱。
public class MyQueue {
Deque<Integer> stackIn;
Deque<Integer> stackOut;
public MyQueue(){
stackIn = new LinkedList<>();
stackOut = new LinkedList<>();
}
public void push(int x){
stackIn.push(x);
}
public int pop(){
if(stackOut.isEmpty()){
dumpStackIn();
}
return stackOut.pop();
}
public int peek(){
if(stackOut.isEmpty()){
dumpStackIn();
}
return stackOut.peek();
}
public boolean empty(){
return stackIn.isEmpty() && stackOut.isEmpty();
}
public void dumpStackIn(){
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}
2、队列实现栈
1、只用1个队列实现
主要是模拟出栈:把队列size-1个出队再入队,就可以让真正该出的元素出去,模拟出栈。
public class MyStack {
Queue<Integer> queue;
public MyStack(){
queue = new LinkedList<>();
}
public void push(int x){
queue.add(x);
}
public boolean empty(){
return queue.isEmpty();
}
public int pop(){
repositon();
return queue.poll();
}
//栈:123,321
//队列:123,换顺序,312,因为模拟不出栈,所以取值后要复原,123
//换位后,如果直接return queue.peek(),则没有复原,顺序变为312,下一次进行相关操作,开始顺 序就错了
public int top(){
repositon();
int res = queue.poll();
queue.add(res);
return res;
}
public void repositon(){
int size = queue.size();
size--;
while(size-- > 0){
queue.add(queue.poll());
}
}
}
2、用2个队列
入栈操作时,首先将元素入队到 queue2,然后将 queue1的全部元素依次出队并入队到queue2,此时 queue2的前端的元素即为新入栈的元素,再将 queue1和queue2互换,则 queue1的元素即为栈内的元素,queue 1的前端和后端分别对应栈顶和栈底。
queue1,作为真正存数据的;queue2,作为辅助队列
public class MyStack2 {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack2(){
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int x){
queue2.offer(x);
while(!queue1.isEmpty()){
queue2.offer(queue1.poll());
}
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop(){
return queue1.poll();
}
public int top(){
return queue1.peek();
}
public boolean empty(){
return queue1.isEmpty();
}
}