题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
再做题之前,先来梳理一下知识点,何为栈,何为队列
- 栈:先进后出(jvm栈即是java虚拟机栈,它是jvm中的一块内存,该内存一般用来存放局部变量)
- 常用方法:
- E push(E item):放入元素
- E pop():获取栈顶元素并弹出
- E peek():获取栈顶元素
- boolean isEmpty():判断栈是否为空
- 队列:先进先出(只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表)
- 入队列:进行插入操作的一端称为队尾
- 出队列:进行删除操作的一端称为对头
- 普通队列(Queue):队尾进对头出 Queue queue = new LinkedList<>()
- 双端队列(Deque)队尾/头进,队尾/头出 Deque deque = new LinkedList<>()
- 常用方法:
- 普通队列Queue
- offer(e):入队列,队尾入
- poll():出队列,对头出,弹出队尾元素并返回
- peek():获取队头元素
- 双端队列Deque
- offer(e):默认队尾入
- offerFirst(e):对头入
- offerLast(e):队尾入
- peekFirst():获取队头元素
- peekLast():获取队尾元素
- pollFirst():弹出对头元素并返回
- pollLast():弹出队尾元素并返回
appendTail 是队尾入,deleteHead 是对头出,所以题目中的队列是普通队列,用两个栈来实现普通队列,那么一个栈做输入数据操作,一个栈做输出数据操作,当输出栈为空的时候,将输入栈中的数据全部放入输出栈中,栈是先进后出,到了两次之后,那么就实现队列的先进先出。
代码如下:
class CQueue {
private Stack inStack ;
//private Deque inStack;
private Stack outStack ;
//private Deque outStack;
public CQueue() {
inStack = new Stack<>();//new ArrayDeque<>()
outStack = new Stack<>();
}
public void appendTail(int value) {
inStack.push(value);
}
public int deleteHead() {
if(!outStack.isEmpty()){
return outStack.pop();
}else{
if(inStack.isEmpty()){
return -1;
}else{
while(!inStack.isEmpty()){
outStack.push(inStack.pop());
}
return outStack.pop();
}
}
}
}