用栈实现队列
原题链接:点我传送
原题描述:使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:
你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。**
栈的特点是先入后出,而队列的特点是先入先出,很显然如果只用一个栈来实现队列是不可能的,我们可以考虑用两个栈来实现一个队列
- 队列的核心操作无非就两个:一个是入队,一个是出队
- 我们可以通过构建两个栈A,B,比如我输入到队列中的元素顺序是1->2->3,那么出队的顺序是1->2->3,我们需要怎么通过A、B两个栈来实现这个过程呢,首先我们用A栈来接收元素1->2->3,然后将A栈的元素全部弹出,那么弹出顺序是3->2->1,然后我们按A栈的弹出顺序压入B栈中3->2->1,然后再将B栈中的元素弹出就是1->2->3了。
- 接下来就是实现了,现在的阶段就是一看就会,一写就跪。emmm
class MyQueue{
Stack<Integer> A;//A栈
Stack<Integer> B;//B栈
int first;//用来记录栈顶元素
}
1、初始化
Myqueue(){
A = new Stack<>();
B = new Stack<>();
this.first = 0;
}
2、 将一个元素放入队列的尾部(入队)
//入队操作是将元素压入A栈中,如果B栈中有元素的时候就不能直接压入A栈中,
//需要将全部A栈中的元素先全部弹出压入B栈
public int push(int x){
if(A.isEmpty()){
first = x;
}
A.push(x);
}
3、 返回队列是否为空
public boolean isEmpty(){
return (A.isEmpty() && B.isEmpty());
}
4、 返回队列首部的元素
public int peek(){
if(B.isEmpty()) return B.peek();
return first;
}
5、从队列首部移除元素
要从队列移除元素,也就是出队,也就是B进行出栈操作,如果B栈为空,就把A栈的元素全部弹出然后压入B栈中
public int pop(){
if(B.isEmpty()){
while(A.isEmpty()){
B.push(A.pop());
}
return B.pop();
}
return B.pop();
}