本题最难的就是理解题啥意思:
本来理解的就对,但看了一眼解析直接跑到了外太空;
咱们来看题中给的示例:
输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[],[3],[],[]] 输出:[null,null,3,-1] 输入: ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"] [[],[],[5],[2],[],[]] 输出:[null,-1,null,null,5,2]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入的两行,个数相同,一一对应,我这里误解为这事两个栈了;其实不然,此题为两个栈来模拟的一个逻辑队列,很好判断,抓住一点,队列内的元素应该一致
,一会是字符串,一会是数,可能性很小,所以可以很快推出这俩列表是给了操作队列的操作和操作数,以示例1为例:
双栈实现队列过程详情:
栈:先进后出,队列:先进先出;
所以可以设置stack1为入队栈,stack2为出队栈;
stack2中有元素一定是先于stack1中元素的,所有stack2中有元素就直接出栈即为出队;
代码详情:Coding-Interviews/09-用两个栈实现队列-参考学习 at main · kp-hang/Coding-Interviews (github.com)
type CQueue struct { // 结构体定义; stack1 *list.List stack2 *list.List } func Constructor() CQueue { // 结构体实例化,最常用; return CQueue{ stack1: list.New(), stack2: list.New(), } } func (this *CQueue) AppendTail(value int) { this.stack1.PushBack(value) // 尾插; } func (this *CQueue) DeleteHead() int { if this.stack2.Len() == 0 { //出栈为空,就从入栈里转移元素; for this.stack1.Len() > 0 { this.stack2.PushBack(this.stack1.Remove(this.stack1.Back())) } } if this.stack2.Len() != 0 { e := this.stack2.Back() this.stack2.Remove(e) return e.Value.(int) } return -1 } /** * Your CQueue object will be instantiated and called as such: * obj := Constructor(); * obj.AppendTail(value); * param_2 := obj.DeleteHead(); */
值得注意的是认真阅读标准库函数的说明,比如:
func (*list.List).Remove(e *list.Element) interface{} (list.List).Remove on pkg.go.dev Remove removes e from l if e is an element of list l. It returns the element value e.Value. The element must not be nil.