232.用栈实现队列
题目链接:代码随想录
-
本题解题思路:
关键点,经过两个栈的进出颠倒,保证元素先进先出
①设置两个栈,一个用于进栈,一个用于出栈,这样确保元素顺序与队列顺序一致
②本题压栈没有注意点
③本题出栈的时候,一定在Out栈为NULL的情况下,要将In栈中的数据全部放入Out栈,这样最后弹栈顺序一致;
如果Out栈不为Null时,说明Out栈中已经有了数据,此时先Pop out栈中的数据,因为Out栈就是用来输出的 -
class MyQueue {
private Deque stackIn;
private Deque stackOut;
public MyQueue() {
stackIn = new LinkedList<>();
stackOut = new LinkedList<>();
}
//压栈的时候直接压入即可
public void push(int x) {
stackIn.offer(x);
}
public int pop() {
//将In栈数据全部倾斜到Out栈
dumpStackIn();
return (Integer)stackOut.poll();
}
public int peek() {
dumpStackIn();
return (Integer)stackOut.peek();
}
/**
* 判空条件是In栈和Out栈中都没有数据,说明彻底没有数据了
* @return
*/
public boolean empty() {
return stackIn.isEmpty() && stackOut.isEmpty();
}
public void dumpStackIn(){
//如果out栈还有数据,那么直接输出out栈数据即可
if(stackOut.isEmpty() != true){return;}
//全部倾泻
while(!stackIn.isEmpty()){
Object poll = stackIn.poll();
stackOut.offer(poll);
}
}
}
225. 用队列实现栈
题目链接:代码随想录
- 解题思路:
这个题想的时候,明确队列中元素从尾部进入到首部,出去的时候从首部出去的特点
①用一个双向队列的单侧队列的方法来做到
②进栈照常进栈
③出栈的话,把队列的前n - 1个元素都移动到队列的后方,然后再弹出队列,这样模拟弹出栈的操作
④DequeAPI:出栈直接调用双侧队列的pollLast()方法也行
class MyStack {
private Deque myDeque;
public MyStack() {
myDeque = new LinkedList<>();
}
public void push(int x) {
myDeque.offer(x);
}
public int pop() {
int size = myDeque.size();
size--;
//进行移动元素到末尾
while(size > 0){
myDeque.addLast(myDeque.poll());
size--;
}
// int res = (Integer)myDeque.pollLast();
int res = (Integer)myDeque.pollFirst();
return res;
}
/**
* 直接调用双侧队列的API
* @return
*/
public int top() {
return (Integer)myDeque.peekLast();
}
public boolean empty() {
return myDeque.isEmpty();
}
}