用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
关于力扣的题目,需要思考的问题包括有如何将力扣的题目与当前试题分开,如何思考正确的解题方式。
知道队列的意思是先入后出,这一边先进入队列,那边再出队列。但是栈不同,栈只能从上面压入从上面出来,所以需要实现的问题在于,压入的时候按照栈的方式正常压入,当需要弹出的时候,得将栈反转,再弹出。
s1,s2 = [], []
# 压入
s1.append(i)
# 弹出
while s1:
s2.append(s1.pop())
s2.pop()
等于弹出的时候,将栈进行反转,再直接采用栈的方式弹出就好。
class queue:
def __init__(self):
self.s1,self.s2 = [], []
def append_(self,value):
self.s1.append(value)
def pop_(self):
if not self.s1 and not self.s2:return -1
if not self.s2:
while self.s1:
self.s2.append(self.s1.pop())
return self.s2.pop()
还有一个就是火车入栈,上次已经做过分析。主要思路就是将通过栈内弹出和压入的方式。
问题描述在有一排火车需要入站,但是只能先进先出的方式入栈,思考所有的入栈方式。
def stack(wait,stack,leave):
if not wait and not stack:return ans
if wait:
stack(wait[:-1],stack+[wait[-1],leave)
if stack:
stack(wait[:],stack[:-1],leave+[stack[-1]])
在方法中,离开和栈中的判断方式是if 和if 而不是if...elif这种,因为两个判断方式是并列的,需要同时考虑,当前条件下既可入栈也可出栈。