用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
通过两个栈来实现队列,栈是先进后出,而队列是先进先出,两个栈一个进一个出,一号栈进,二号栈出,二号栈没了要从一号栈里面要。
需注意的问题:
- 两个栈什么时候调个元素
- 分成几种情况(空与不空)
- 在那个哪个函数里面进行调个
解题过程如下
import java.util.Stack;
class CQueue {
Stack<Integer> stack1= new Stack<>();
Stack<Integer> stack2= new Stack<>();
public CQueue() {
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if (stack2.empty() && stack1.empty()) {
return -1;
}
else {
if(stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
}
解决问题1:
两个栈什么时候调个?
必须在二号栈没有元素的时候,才能像一号栈要元素,假如二号栈还没有出完,那么一号栈的元素进来下次再出必出刚才进来的,违反了队列的顺序,这条是必须遵守的准则
二号栈是关键,决定了什么时候向一号栈要元素d
解决问题2:
分成几种情况(空与不空)
肯定是四种啦,为什么要考虑呢,因为这是我刷的第一道算法题,有点紧张没有吧 if 情况想全导致拉低了过率。if的情况不全在大量数据的测试下会垮掉
if (stack2.empty() && stack1.empty()) {
return -1;
}
else {
if(stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
我是先考虑的什么时候返回-1,肯定是二号栈没有,但是一号栈要是有的话,队列还是非空的,所以需要二者同时为空,此队列空,返回负一,下一个条件就是判断什么时候向一号栈要元素,肯定是二号栈空且一号栈非空,那么还剩下两种情况没考虑,1空2不空直接出队列,1不空2也不空,也是直接出,所以直接写了return;
解决问题3:
在那个哪个函数里面进行调个?
二者都可以实现