目录
题目概述(简单难度)
思路与代码
思路展现
代码示例
错误示范
题目概述(简单难度)
题目链接:
点我进入对应题目
思路与代码
思路展现
做这题之前我们首先要明白一点就是,栈是先进后出的,队列是先进先出的。我 们 可以 使用两个栈stackPop和stackPush,往队列中添加元素的时候直接把要添加的值压入 到 stackPush 栈 中 。 往 队 列 中 删 除 元 素 的 时 候 如 果 stackPop 中 有 元 素 我 们 就 直 接 删 除,如果没有元素,我们需要把stackPush中的元素全部出栈放到stackPop中,然后 再删除stackPop中的元素。这样做的目的我们就可以保证stackPop中的元素永远都是 比stackPush中的元素更老。
代码示例
class CQueue { Stack<Integer> stackPush = new Stack<>(); Stack<Integer> stackPop = new Stack<>(); public CQueue() { } public void appendTail(int value) { stackPush.push(value); } public int deleteHead() { if(stackPop.isEmpty()) { while(!stackPush.isEmpty()) { stackPop.push(stackPush.pop()); } } return stackPop.isEmpty() ? -1 : stackPop.pop(); } }
错误示范
我自己一开始再写deleteHead中的代码的时候,把if语句写到了while循环的内部,这样写的话就会有一个测试用例通不过,导致最终超出了时间限制:
为什么会超出时间限制,是因为这里我们如果将if语句写到while循环的内部,像下面这样写:
while(!stackPush.isEmpty()) { if(stackPop.isEmpty()) { stackPop.push(stackPush.pop()); }
这样写的话就会报错,原因是当我们插入5,2之后,此时stackPush里面有5和2两个元素,而我们的stackPop里面只有5这个元素,然后回到while后此时stackPush里面有2这个元素,然后执行到(stackPop.isEmpty())这条语句,发现stackPop不为空,则进入不到if语句内部,然后又回到了while语句,从此一直循环下去了.