2023.3.24 用栈实现队列
如何才能用两个栈实现队列?
思路:由于栈是先进后出,而队列是先进先出的,所以如果要想用一个栈实现队列是不可能的,name如何用两个栈来实现呢?
我们可以将一个栈a用来接收输入,此时栈底的元素就是我们第一个元素,如果要将其输出,我们此时挨个将栈a的元素弹出到栈b,由于栈是先进后出,此时栈b中的最顶层的值就是栈a中的最底层的值,即最开始的值,由此就实现了先进先出的功能。
class MyQueue {
Deque<Integer> a;
Deque<Integer> b;
public MyQueue(){
a = new ArrayDeque<>();
b = new ArrayDeque<>();
}
public void push(int x){
a.push(x);
}
public int pop(){
if(b.peek() != null){
return b.pop();
}
else{
while(a.peek()!= null) {
b.push(a.pop());
}
return b.pop();
}
}
public int peek(){
if(b.peek() != null){
return b.peek();
}
else{
while(a.peek()!= null) {
b.push(a.pop());
}
return b.peek();
}
}
public boolean empty(){
if(b.peek() == null && a.peek() == null){
return true;
}
else{
return false;
}
}
}
2023.3.24 用队列实现栈
队列是先进先出的,如果我们想要实现栈的先进后出功能,即在实现pop功能时将队列的最后一个元素取出,此时需要进行一个循环操作,即将队列最后一个元素之前的元素重新放入队列中,此时队列头元素就是我们需要取出的元素了。
class MyStack {
Deque<Integer> queue;
public MyStack() {
queue = new ArrayDeque<>();
}
public void push(int x) {
queue.offer(x);
}
public int pop() {
int size = queue.size();
//将队列前面的值重新放入队列尾部,只留下开始队列的尾部元素
while(size > 1){
size--;
queue.offer(queue.poll());
}
return queue.poll();
}
public int top() {
return queue.peekLast();
}
public boolean empty() {
if(queue.size() != 0){
return false;
}
else{
return true;
}
}
}
主要点还是要想明白怎么利用各自的特点的。涉及到了Deque的使用。