AcWing36:用两个栈实现队列
Posted 劭兮劭兮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing36:用两个栈实现队列相关的知识,希望对你有一定的参考价值。
问题
原题链接:
解题思路
本小白在此选用的是JAVA语言:
根据本题,我们需要先来了解JAVA中的堆栈,
JAVA语言中有专门的 Stack类表示栈:
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。
拓展:Vector类
Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:
- Vector 是同步访问的。
- Vector 包含了许多传统的方法,这些方法不属于集合框架。
Vector 主要用在事先不知道数组的大小,或者只是需要一个可以改变大小的数组的情况。
下面一起来看一下Vector类所特有的方法:
转入正题,本题目要用用两个栈实现队列,
- 栈:先进后出
- 队列:先进先出
- 示意图:
在本题中,我们声明定义两个栈,栈 stack1 用于 存储数组,栈 stack2 用于协助栈 stack1 完成取栈底元素等操作;即 一个主栈,用来存储数据;一个辅助栈,用来当缓存。
题目的要求如下:
- push(x) – 将元素x插到队尾;
- 解析:将元素插到队尾,即将元素插到stack1的栈顶既可;
- 代码实现:
/** Push element x to the back of queue. */
public void push(int x) {
stack1.push(x);
}
- pop() – 将队首的元素弹出,并返回该元素;
- 解析:将队首元素弹出,即将 栈底元素 弹出,此时需要把 stack1 中的元素全部迁移到 stack2 中,取 stack2 中的栈顶元素,最后,将 stack2 中元素全部返回进入 stack1 中;
- 代码实现:
/** Removes the element from in front of queue and returns that element. */
public int pop() {
if(!stack1.empty()) {
while(!stack1.empty()) {
stack2.push(stack1.pop());
}
int popElement = stack2.pop();
while(!stack2.empty()) {
stack1.push(stack2.pop());
}
return popElement;
}
return 0;
}
- peek() – 返回队首元素;
- 解析:此时我们需要弹出最先进入栈的元素,也就是栈底元素。我们可以先将所有元素从主栈中弹出,压入辅助栈中。则辅助栈的栈顶元素就是我们要返回的元素。然后再将辅助栈中的元素全部弹出,压入主栈中。
- 代码实现:
/** Get the front element. */
public int peek() {
if(!stack1.empty()) {
while(!stack1.empty()) {
stack2.push(stack1.pop());
}
int peekElement = stack2.peek();
while(!stack2.empty()) {
stack1.push(stack2.pop());
}
return peekElement;
}
return 0;
}
- empty() – 返回队列是否为空;
- 解析:判断主栈是否为空;
- 代码实现:
/** Returns whether the queue is empty. */
public boolean empty() {
if(stack1.empty()) {
return true;
}else {
return false;
}
}
JAVA实现
class MyQueue {
Stack<Integer> stack1 = new Stack<>();
Stack<Integer> stack2 = new Stack<>();
/** Initialize your data structure here. */
public MyQueue() {
}
/** Push element x to the back of queue. */
public void push(int x) {
stack1.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
if(!stack1.empty()) {
while(!stack1.empty()) {
stack2.push(stack1.pop());
}
int popElement = stack2.pop();
while(!stack2.empty()) {
stack1.push(stack2.pop());
}
return popElement;
}
return 0;
}
/** Get the front element. */
public int peek() {
if(!stack1.empty()) {
while(!stack1.empty()) {
stack2.push(stack1.pop());
}
int peekElement = stack2.peek();
while(!stack2.empty()) {
stack1.push(stack2.pop());
}
return peekElement;
}
return 0;
}
/** Returns whether the queue is empty. */
public boolean empty() {
if(stack1.empty()) {
return true;
}else {
return false;
}
}
}
/**
* 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();
*/
小记:
原题链接:用两个栈实现队列
以上是关于AcWing36:用两个栈实现队列的主要内容,如果未能解决你的问题,请参考以下文章