1、232. 用栈实现队列
class MyQueue {
//整体实现思路:队列是先进先出,栈是先进后出。使用两个栈,一个栈A负责进,一个栈B负责接收栈A数据,然后出出,队列:A->B>C 栈A:A->B>C 栈B:栈A进,C->B->A,然后出,实现A->B->C
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
//进,只在stackIn中
public void push(int x) {
stackIn.push(x);
}
//出,出就要用到stackIn和stackOut结合
public int pop() {
dumpStackIn();
return stackOut.pop(); //出,如果有元素,那就出
}
//获取头元素
public int peek() {
dumpStackIn();
return stackOut.peek();
}
//判断是否为空,两个都为空才行
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
public void dumpStackIn(){
if(!stackOut.isEmpty()) return; //不为空什么都不管
while(!stackIn.isEmpty()){ // 没有元素,则就需要将stacIn中装到stackOut
stackOut.push(stackIn.pop());
}
}
}
/**
* 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();
*/
下面一种错误的写法,why? 错在pop和top都进行了一次移除并追加操作
public int pop() {
//弹出是,就是出栈,将要出元素的前面元素移除并添加在该队列后面即可。
int len = queue.size();
while(len>1){
queue.offer(queue.poll());
len–;
}
return queue.poll();
}
public int top() {
int len = queue.size();
while(len>1){
queue.offer(queue.poll());
len–;
}
return queue.peek();
}
class MyStack {
//用队列实现栈,跟用栈实现队列不一样,单方向队列下,假设用一样的思维的话,第二个队列还是先进先出,并不能实现栈的思维。
//实现过程1:可以使用两个队列,主队列出,辅助队列只是为了临时存储,出了之后又要恢复。
//实现过程2:使用一个队列,进的时候只需要将新的元素追加到前面即可。
Queue<Integer> queue ;
public MyStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.offer(x);
int len = queue.size();
while(len>1){
queue.offer(queue.poll());
len--;
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.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();
*/
3、补充知识
-
Queue和Deque异同介绍
-
我们知道,Queue是队列,只能一头进,另一头出。
-
如果把条件放松一下,允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),学名Deque。
-
Java集合提供了接口Deque来实现一个双端队列,它的功能是:
- 既可以添加到队尾,也可以添加到队首;
- 既可以从队首获取,又可以从队尾获取。