232.用栈实现队列
思路:
用栈实现队列 ,创建两个栈,一个输入栈一个输出栈 先将元素压入输入栈,弹出的时候将输入栈元素全部压入输出栈,这样就形成了先进先出实现队列了
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>(); //负责进栈元素
stackOut = new Stack<>();
}
public void push(int x) {
stackIn.push(x);
}
public int pop() {
dumpstackIn();
return stackOut.pop();
}
public int peek() {
dumpstackIn();
return stackOut.peek();
}
public boolean empty() {
//两个栈全为空,队列才为空
return stackIn.isEmpty() && stackOut.isEmpty();
}
// 如果stackOut为空,那么将stackIn中的元素全部放到stackOut中
private void dumpstackIn(){
//输出栈不为空
if(!stackOut.isEmpty()) return;
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}
225. 用队列实现栈
1、Deque与Queue
了解这个之前,我们要先知道什么是Deque,它和Queue有什么区别:在java中,Queue被定义成单端队列使用,Deque被定义成双端队列 即Queue可以访问两端但是只能修改队头,而Deque可以访问两端并且可以在队首和队尾删除和插入元素。
基于Deque的特性,ArrayDeque即可以作为Queue来使用也可以作为栈来使用,而且可以决定队列那边受限或者栈哪边进出。
两个队列实现栈,一个主要队列 q1,一个临时存放队列 q2。
思路:第一次将元素添加q1,第二次添加元素先将q1里面的元素全部转移到q2,再将元素添加到q1,然后再将q2里面的元素转移到q1末尾 这样就实现了先进后出的栈。
class MyStack {
//两个队列实现栈
//主要队列
Queue<Integer> q1 = new LinkedList<>();
//临时队列
Queue<Integer> q2 = new LinkedList<>();
public MyStack() {
}
//第一次将元素添加q1,第二次添加元素先将q1里面的元素全部转移到q2,再将元素添加到q1,然后再将q2里面的元素转移到q1末尾 这样就实现了先进后出的栈
public void push(int x) {
//判断q1是否有元素,如果有将元素全部转移到q2;
while(!q1.isEmpty()){
q2.add(q1.poll());
}
//第一次添加元素直接加入q1
q1.add(x);
//再将转移到q2里面的元素全部又转移回来
while(!q2.isEmpty()){
q1.add(q2.poll());
}
}
public int pop() {
return q1.poll();
}
public int top() {
return q1.peek();
}
public boolean empty() {
return q1.isEmpty();
}
}
优化:一个队列实现栈
思路:每 offer 一个数(A)进来,都重新排列,把这个数(A)放到队列的队首,倒序放入队列
class MyStack {
//每 offer 一个数(A)进来,都重新排列,把这个数(A)放到队列的队首
Queue<Integer> q1 = new LinkedList<>();
public MyStack() {
}
public void push(int x) {
q1.add(x);
//移动除去当前元素的其他数,移动到队列末尾
int size = q1.size();
while(size-- > 1){
q1.add(q1.poll());
}
}
public int pop() {
return q1.poll();
}
public int top() {
return q1.peek();
}
public boolean empty() {
return q1.isEmpty();
}
}