栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算。没有了位置概念,保证任何时候可以访问、删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序。

由于栈数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。

栈结构实现

栈可以用顺序表实现,也可以用链表实现。

栈的操作

  • Stack() 创建一个新的空栈
  • push(item) 添加一个新的元素item到栈顶
  • pop() 弹出栈顶元素
  • peek() 返回栈顶元素
  • is_empty() 判断栈是否为空
  • size() 返回栈的元素个数
class Stack(object):"""栈"""def __init__(self):self.items = []def is_empty(self):"""判断是否为空"""return self.items == []def push(self, item):"""加入元素"""self.items.append(item)def pop(self):"""弹出元素"""return self.items.pop()def peek(self):"""返回栈顶元素"""return self.items[len(self.items)-1]def size(self):"""返回栈的大小"""return len(self.items)if __name__ == "__main__":stack = Stack()stack.push("hello")stack.push("world")stack.push("itcast")print stack.size()print stack.peek()print stack.pop()print stack.pop()print stack.pop()

队列

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

队列是一种先进先出的(First In First Out)的线性表,简称FIFO。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,总是在队列最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后。

队列的实现

同栈一样,队列也可以用顺序表或者链表实现。

操作

  • Queue() 创建一个空的队列
  • enqueue(item) 往队列中添加一个item元素
  • dequeue() 从队列头部删除一个元素
  • is_empty() 判断一个队列是否为空
  • size() 返回队列的大小
class Queue(object):"""队列"""def __init__(self):self.items = []def is_empty(self):return self.items == []def enqueue(self, item):"""进队列"""self.items.insert(0,item)def dequeue(self):"""出队列"""return self.items.pop()def size(self):"""返回大小"""return len(self.items)if __name__ == "__main__":q = Queue()q.enqueue("hello")q.enqueue("world")q.enqueue("itcast")print q.size()print q.dequeue()print q.dequeue()print q.dequeue()

队列的应用

1.windows中的消息机制就是通过队列来实现的
2.操作系统的进程、作业管理中的先进先出服务
3.异步消息机制,如celery异步任务

约瑟夫斯问题(热土豆游戏)

这场比赛是一个现代的相当著名的约瑟夫斯问题。基于对第一世纪著名历史学家Flavius Josephus的传说,故事说的是,在对罗马犹太人起义,约瑟夫斯和39名战友顶住了罗马人在一个山洞里。随着失败迫在眉睫,他们决定,他们宁愿死也不愿做罗马人的奴隶。他们安排自己在一个圆圈里。一个人被划为第一号,顺时针方向,每第七个男人就杀了一个。约瑟夫斯,根据传说,是一个有成就的数学家。他立刻想出了他应该坐的地方是最后一个去的地方。当时间来了,而不是杀死自己,他加入了罗马的一边。

#打印机任务(拓展不要求会)

图书馆中有一台打印机,打印机有两种工作模式:每分钟10页(但打印质量较低),每分钟5页(打印效果较好)。打印机一次只能处理一个任务,其余任务可排队等候。
每个小时最多有10位学生在图书馆,他们在一小时终最多提交2次打印任务,每个打印任务的页数为1至20页不等。
问:综合分析两种打印模式,分析学生的平均等待打印时间和是否能在1小时内完成所有学生提交的打印任务

双端队列应用

一个有趣的问题,可以很容易地解决了使用队列的数据结构是典型的回文问题。回文数是一个字符串,读取相同的向前和向后的,例如,"sbbs"我们想构造一个算法,输入一个字符串是否回文。这个问题的解决方案将使用一个队列来存储字符串的字符。我们将从左到右弦和添加的每个字符的双端队列后。在这一点上,deque将会表现的非常像一个普通的队列。然而,我们现在可以利用该容器的双重功能。该容器前将字符串和该容器后的第一个字符将举行的最后一个字符

双端队列

双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构。

双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。

操作

  • Deque() 创建一个空的双端队列
  • add_front(item) 从队头加入一个item元素
  • add_rear(item) 从队尾加入一个item元素
  • remove_front() 从队头删除一个item元素
  • remove_rear() 从队尾删除一个item元素
  • is_empty() 判断双端队列是否为空
  • size() 返回队列的大小

实现

class Deque(object):"""双端队列"""def __init__(self):self.items = []def is_empty(self):"""判断队列是否为空"""return self.items == []def add_front(self, item):"""在队头添加元素"""self.items.insert(0,item)def add_rear(self, item):"""在队尾添加元素"""self.items.append(item)def remove_front(self):"""从队头删除元素"""return self.items.pop(0)def remove_rear(self):"""从队尾删除元素"""return self.items.pop()def size(self):"""返回队列大小"""return len(self.items)if __name__ == "__main__":deque = Deque()deque.add_front(1)deque.add_front(2)deque.add_rear(3)deque.add_rear(4)print deque.size()print deque.remove_front()print deque.remove_front()print deque.remove_rear()print deque.remove_rear()

企业面试题

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

    class Solution:def __init__(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()return self.stack2.pop()
    
  2. 两个队列实现一个栈

    思路:

    进栈:元素入队列A

    出栈:判断如果队列A只有一个元素,则直接出队。否则,把队A中的元素出队并入队B,直到队A中只有一个元素,再直接出队。为了下一次继续操作,互换队A和队B。

    class Solution:def __init__(self):self.queue1 = []self.queue2 = []def add(self, node):# write code hereself.queue1.append(node)def dele(self):# return xxif self.queue1 == []:return Nonewhile len(self.queue1) != 1:self.queue2.append(self.queue1.pop(0))self.queue1,self.queue2 = self.queue2,self.queue1##交换是为了下一次的popreturn self.queue2.pop()
    

Python--栈和队列相关推荐

  1. python 栈和队列_Python实现栈和队列的简单操作方法示例

    本文实例讲述了Python实现栈和队列的简单操作方法.分享给大家供大家参考,具体如下: 先简单的了解一下数据结构里面的栈和堆: 栈和队列是两种基本的数据结构,同为容器类型.两者根本的区别在于: sta ...

  2. python 栈和队列_python 栈和队列的基本实现

    python中的列表结构可以用来实现栈和队列. [栈]: 栈是一种数据结构,具有先入后出的特点,并且栈的所有操作只能在某一端进行,能进行操作的一端的第一个元素称为栈顶,另一端的第一个元素称为栈底 栈的 ...

  3. python栈和队列

    入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删. 目录 一.栈和队列的概念 1.栈 2.队列 二.python中的LifoQueue(其实也是所 ...

  4. python 栈和队列 排序 初级数据结构

    编写一个类,具有栈和队列的功能.实现以下4个方法: shit()       返回并删除列表中第一个元素 unshit()   在列表的头部'压入'一个新的元素 push()    在列表尾部增加一个 ...

  5. Python栈与队列

    栈: 栈**(也称******下压栈******.堆栈)是******仅允许在表尾****进行插入和删除操作的线性表. 我们把允许插入和删除的一端称为****栈顶******,另一端称为******栈 ...

  6. 让python飞:形象理解python 栈、队列、lambda、生成器、迭代器、模块

    Day10 棒球和球棒与水晶火炉和五彩宝箱 棒球和球棒来到了足球场,要打棒球!但是球场工作人员不同意.棒球和球棒表示不服.球场工作人员说,这样吧,你按我们的规则完成任务,我们就让你们在这里玩.这里有两 ...

  7. python - 栈与队列(只有代码)

    1. 栈: - 后进先出 class Stack(object):def __init__(self):self.stack = []def peek(self):return self.stack[ ...

  8. python栈与队列的封装

    项目案例一:栈的封装 栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),允许进行操作的一端称为"栈顶",另一固定端称为"栈底",当栈中没有元素时称为&q ...

  9. python 栈和队列_python实现栈和队列

    栈(Stack),也叫做堆栈, 是一种容器, 可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop ...

  10. python 栈和队列的区别_Python 栈与队列

    一.栈: #栈的实现,先进后出 class Stack(object): def __init__(self): self.__list = [] def push(self,item): self. ...

最新文章

  1. 自动编码(Autoencoder)器异常检测(outlier detection)实战
  2. 互联网思维-NO.1思维(1)
  3. 开展企业网站建设如何做到保质保量?
  4. python在文本添加超链接_Python将超链接文本打印到Spyder控制台(Python print hyperlinked text to Spyder Console)...
  5. linux添加用户命令_为Linux的cp和mv命令添加进度条
  6. android实现欢迎启动界面
  7. 中秋祝福网页制作_幼儿园中秋节活动方案(附环创)
  8. Win10右键添加notepad++
  9. 老李分享:单元测试的 5 个错误
  10. rabbitMQ概念详细介绍
  11. 360怎么不能一次打完所有补丁?
  12. f2fs学习笔记 - 3. F2FS文件系统布局
  13. 安装linux取消硬盘密码设置,linux下硬盘加密方法
  14. 图片裁切批处理_图片批量处理 如何批量将图片裁剪成一样的大小?按照一定的比例快速裁剪多张照片...
  15. 位偏移 java_时区和偏移类 / Zone and Offset
  16. SEO入门一篇就够-SEO教程
  17. panic: reflect.Value.Interface: cannot return value obtained from unexported field or method
  18. vue-cli-service build 如何环境设置,打出不同环境的包
  19. 进一步解读自主可控云CAD:CrownCAD
  20. VHDL设计——交通红绿灯控制器模块

热门文章

  1. 如何理解构建人类命运共同体思想的科学内涵?
  2. 《马东的职场 B 计划》 学习笔记
  3. 程序江湖:第十八章 察颜观色的伙伴
  4. linux ibm mq 安装,消息发送与接收
  5. 关于佛家所说的108种烦恼 [转帖]
  6. aqr资本二十年精选二十篇_2016年3月:前10名和编辑精选
  7. 基于单片机的电子密码锁1602液晶显示设计
  8. fanuc c语言编程实例,FANUC机器人程序案例参考
  9. 云计算-存算一体-EDA-技术杂谈
  10. /dev/mapper/vg_xxx-lv_root 100% 磁盘打满解决方式及思路