剑指 Offer 09. 用两个栈实现队列
题目描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
题目解释:
输入:
[“CQueue”,”appendTail”,”deleteHead”,”deleteHead”]
这一行表示每一行代码的操作
[[],[3],[],[]]
这个表示每一行代码操作所需要的参数
举例:
CQueue 表示新建一个CQueue对象,对应的所需参数为[],即此操作不需要参数。
appendTail 表示执行一个appendTail()操作,对应要被操作的元素为3。
deleteHead 表示执行一个deleteHead操作,对应的所需参数为[],即此操作不需要参数。
deleteHead 表示执行一个deleteHead操作,对应的所需参数为[],即此操作不需要参数。
以上的输入其实是一个代码执行的步骤描述与其对应所需参数。
即两个纬度:
1、操作描述
2、此次操作所需参数
3、操作描述与操作所需参数是通过默认顺序一一对应的。
示例:
输入:
[“CQueue”,”appendTail”,”deleteHead”,”deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]
输入:
[“CQueue”,”deleteHead”,”appendTail”,”appendTail”,”deleteHead”,”deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
思路:
栈后进先出,队列先进先出
双栈可以实现序列倒置:假设有 stack1=[1, 2, 3] 、 stack2=[] ,如果循环出栈 stack1 并将出栈元素进栈 stack2 ,则循环结束后, stack1=[] 、 stack2=[3, 2, 1] ,即通过 stack2 实现了 stack1 中元素的倒置
当需要删除队首元素时,仅仅需要 stack2 出栈即可;当 stack2 为空时,出队就需要将 stack1 元素倒置倒 stack2 , stack2 再出队即可;如果 stack1 也为空,即队列中没有元素,返回 -1
代码:
1 | var CQueue = function() { |