题目:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
实例:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]
当时没看实例懂什么意思,看了评论内容恍然大悟:
第一个列表中对应的是每一步的操作;
第二个列表是传入的参数(初始化队列和删除队列元素不需要参数所以是null);
第三个输出的列表表示的是每一步操作的返回值(同样地,初始化队列和添加元素是没有返回值的,只有删除队列的元素是才会返回删除的元素,没有元素的话返回-1).
解题思路:
这两个栈有主次之分,其中一个是作为辅助栈进行添加元素操作,栈的“后入先出”的特性可以保障元素在辅助栈
和主栈的传递元素过程中的顺序不会发生变化。
添加元素功能:
由于队列特性为:先入先出即一端为出口,一端为进口,而栈是一端作为进出口。
所以需要把后来新加入的元素放在栈的最低端,在利用栈删除时才能达到队列删除的“先进先出”的效果。
具体操作为:在向stack1加入value时,先把stack1中的左右元素压入stack2,再把value放入stack1,之后再把stack2的元素入栈。
删除操作:
此时可对stak1进行删除,对于stakc1来说删除的是栈顶元素,但是对于整个队列来说,删除的是队列底部的元素。
代码:
class MakeQueue {
Stack<Integer> stack1;
Stack<Integer> stack2;
int size;
public MakeQueue() {
stack1 = new Stack<Integer>();
stack2 = new Stack<Integer>();
size = 0;
}
//添加操作
public void appendTail(int value) {
//1.将stak1的所有元素转移到stak2里
while (!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
//2.将新加入的元素放在第一个栈的底部,在栈结构中是后进先出,但是我们实现的是队列的功能,就是后进后出
stack1.push(value);
//3.添加完在把原来的元素重新入栈
while (!stack2.isEmpty()) {
stack1.push(stack2.pop());
}
size++;
}
//删除操作
public int deleteHead() {
if (size == 0) {
return -1;
}
size--;
return stack1.pop();//此时删除的就是最早如队列的元素
}
}
Reference:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/mian-shi-ti-09-yong-liang-ge-zhan-shi-xian-dui-l-3/