秦小少【剑指offer(1)】两个栈实现一个队列

tech2022-09-30  106

 

文章目录

题目描述一、考察知识点二、代码实现 1.分析思路2.注意事项总结

 


题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

 


 

一、考察知识点

栈和队列的概念,以及转换关系

栈:特点是先进后出(FILO),可以理解成一个子弹夹。

队列:特点是先进先出(FIFO),可以理解成日常的排队,先到先得。

二、代码实现

1.分析思路

当知道栈和队列的特点之后,仍然不知道怎么去实现的时候,可以用走几个例子进行模拟实现。

当我们向模拟的队列插入数1,2,3时,假设插入的是stack1,此时栈中的情况是:

栈stack1:[1,2,3]栈stack2: []

当需要弹出一个数,根据队列的“先进先出”的原则,1先进入队列,1应该先弹出,然而进入栈的时候1被压入了stack1的栈底,于是需要将栈stack1的全部元素逐个弹出压入stack2中(注意:必须全部出栈,才可以去栈2取数据),现在可以正确的从stack2弹出1,此时栈中的情况是:

栈stack1:[]栈stack2:[3,2]

继续弹出下一个数,2比3先进入队列。应该2先弹出,此时2刚好在栈stack2的栈顶,可直接弹出,此时栈的情况是:

栈stack1: []栈stack2:[3]

此时向模拟队列插入一个数4,还是压入栈stack1,此时栈的情况是:

栈stack1:[4]栈stack2:[3]

继续弹出下一个数,因为3先进入队列,故3应该先弹出,此时3在栈stack2的栈顶,可直接弹出。

理解:为什么要用两个栈实现一个队列,通过分析以上过程可知负负得正,从而将两个栈配合使用完成队列的功能。

2.注意事项

当插入数据时,直接入栈stack1。当弹出数据的时候,需要分为两种情况,当stack2为空时,将stack1中的元素应逐个弹出(全部弹出)并压入栈stack2,当stack2不为空时,弹出stack2栈顶元素。在python环境中,可以利用定义列表来实现栈的功能。 -*- coding : utf-8 -*- class Solution: def __inin__(self): self.stack1 = [] self.stack2 = [] def push(self, node): self.stack1.append(node) def pop(self): if self.stack2 == []: while self.stack1: self.stack2.append(self.stack1.pop()) return self.stack2.pop()

总结

此题主要考察栈和队列的基础知识及其转换,一般采用模拟分析法进行实例分析后,可以解出此题。注意事项见文中所写。

最新回复(0)