题目:
https://www.nowcoder.com/ta/coding-interviews
用两个栈来实现一个队列;
完成队列的Push和Pop操作;
思考:
栈是有序的 LIFO,也就是后进先出(先进后出);
队列是有序的FIFO,也就是先进先出。
也就是要用两个先进后出的栈,实现先进先出的队列。
例如:stack1={a}; stack2={};
压入b,c:stack1={c,b,a}(a在栈底,c在栈顶);stack2={};
当我们想要弹出a时,由于a在stack1底,不能直接弹出,于是我们先将stack1的元素按照栈先入后出的原则弹出并压入stack2有:stack2={a,b,c}(此时,a在栈顶,c在栈底);
于是,可以顺利从stack2中弹出a,总体上实现队列先入先出的性质。
总结:
push()方法可以利用list.append()方法实现;
pop()方法:判断stack2是否为空,不空,依次弹出栈顶元素;为空,则先将stack1中元素按照先入后出的原则弹出并压入stack2,然后弹出stack2中栈顶元素;总体实现队列功能。
python中可用列表表示后入先出的栈,list.pop()默认删除列表最后一个元素(此外,pop()有可选参数,如:list1.pop(1),1为待删除元素的索引,pop方法返回删除的列表元素);
push()方法,可看作用list.append()往列表尾追加新元素。
1 | list1 = ['Google', 'Runoob', 'Taobao'] |
删除的项为 : Taobao
列表现在为 : ['Google', 'Runoob']
1 | list2 = ['1', '2', '3'] |
列表现在为 : ['1', '2', '3', 'new_4']
1 | class Solution: |
1 | method = Solution() |
stack1= ['y', 'x', 1, 2, 3, 4, 5]
stack2= []
1 | pop = method.pop() |
stack1= []
弹出的元素为 y
stack2= [5, 4, 3, 2, 1, 'x']
由于在push方法中增加了对stack2的处理,原pop方法可以简化,因为处理后的stack2始终为空
1 | class Solution1: |
1 | method = Solution1() |
stack1= [7, 6, 1, 2, 3, 4, 5]
stack2= []
1 | pop = method.pop() |
stack1= []
弹出的元素为 7
stack2= [5, 4, 3, 2, 1, 6]
reference:
1.https://blog.csdn.net/Datawhale/article/details/82118919
2.https://blog.csdn.net/fuxuemingzhu/article/details/79499461
1 |