先来回顾一下栈和队列的基本概念:

相同点:从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。

不同点:栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。 队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定"。

栈必须按"后进先出"的规则进行操作:比如说,小学老师批改学生的作业,如果不打乱作业本的顺序的话,那么老师批改的第一份作业一定是最后那名同学交的那份作业,如果把所有作业本看作是一个栈中的元素,那么最后一个同学交的作业本就是栈顶元素,而第一个同学交的,也就是最低端的作业本,就是栈底元素,这就是对栈的读取规则。

而队列必须按"先进先出"的规则进行操作:打个比方,一些人去银行办理业务,一定是先去排队的最先得到服务,当然他也是第一个走出银行的(假设这些人都在一个窗口排队)。如果把所有这些等候服务的人看作是队的元素,第一个人就是对头元素,相应的,最后一个人就是队尾元素。这是队的读取规则。

用Python实现栈,这是Python核心编程里的一个例子:

# coding=utf-8
class Stack(object):
# 定义一个列表来模拟栈
def __init__(self):
self.stack = []
# CMDs是字典的使用
self.CMDs = {'u': self.pushit, 'o': self.popit, 'v': self.viewstack} # 进栈,调用列表的append()函数加到列表的末尾,strip()没有参数是去掉首尾的空格
def pushit(self):
self.stack.append(input("Enter new string:").strip()) # 出栈,用到了pop函数
def popit(self):
if len(self.stack) == 0:
print("Cannot pop from an empty stack!")
else:
print('Removed [',self.stack.pop(),']') # 遍历栈
def viewstack(self):
print(self.stack) # pr为提示字符
def showmenu(self):
pr = """
p(U)sh
p(O)p
(V)iew
(Q)uit
Enter choice: """
while True:
while True:
try:
# 先用strip()去掉空格,再把第一个字符转换成小写的
choice = input(pr).strip()[0].lower()
except(EOFError,KeyboardInterrupt,IndexError):
choice = 'q'
print('\nYou picked:[%s]'%choice)
if choice not in 'uovq':
print('Invalid option,try again')
else:
break
if choice == 'q':
break
# CMDs[]根据输入的choice从字典中对应相应的value,比如说输入u,从字典中得到value为pushit,执行pushit()进栈操作
self.CMDs[choice]() # 判断是否是从本文件进入,而不是被调用
if __name__ == "__main__":
stack = Stack()
stack.showmenu()

用python实现队列:

# coding=utf-8
class Queue(object):
# 定义一个列表来模拟栈
def __init__(self):
self.queue = []
# CMDs是字典的使用
self.CMDs = {'e': self.enQ, 'd': self.deQ, 'v': self.viewQ} def enQ(self):
self.queue.append(input("Enter new string:").strip()) # 调用list的列表的pop()函数.pop(0)为列表的第一个元素
def deQ(self):
if len(self.queue) == 0:
print("Cannot pop from an empty queue!")
else:
print('Removed [',self.queue.pop(0),']') # 遍历队列
def viewQ(self):
print(self.queue) # pr为提示字符
def showmenu(self):
pr = """
(E)nqueue
(D)equeue
(V)iew
(Q)uit
Enter choice: """
while True:
while True:
try:
# 先用strip()去掉空格,再把第一个字符转换成小写的
choice = input(pr).strip()[0].lower()
except(EOFError,KeyboardInterrupt,IndexError):
choice = 'q'
print('\nYou picked:[%s]'%choice)
if choice not in 'devq':
print('Invalid option,try again')
else:
break
if choice == 'q':
break
self.CMDs[choice]() # 判断是否是从本文件进入,而不是被调用
if __name__ == "__main__":
queue = Queue()
queue.showmenu()

栈和队列数据结构的基本概念及其相关的Python实现的更多相关文章

  1. 栈和队列数据结构的相互实现[LeetCode]

    栈是先进后出,队列是先进后出,这里讨论一下两种数据结构之间的相互实现. 一.用两个栈实现队列 我们用一个栈来实现队列的进队操作(栈A),用另一个栈来实现队列的出队操作(栈B). 1.入队列: 把元素放 ...

  2. 九度OJ 1512 用两个栈实现队列 【数据结构】

    题目地址:http://ac.jobdu.com/problem.php?pid=1512 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 输入: 每 ...

  3. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  4. LeetCode 232:用栈实现队列 Implement Queue using Stacks

    题目: 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列是 ...

  5. 前、中、后序遍历随意两种是否能确定一个二叉树?理由? && 栈和队列的特点和区别

    前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列 ...

  6. 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

    表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...

  7. [Python] 数据结构--实现顺序表、链表、栈和队列

    说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...

  8. C语言数据结构——第三章 栈和队列

    三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性 ...

  9. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

随机推荐

  1. 热门话题,2020年了,web前端还好找工作吗?

    #大师助手-全网唯一免费上pin 如果你要是和前几年的前端市场相比,那我会告诉你“不好找” 其实好不好找工作,是跟自己的能力分不开的.但是就前端开发这个行业本身来说,它的就业前景还是相当不错的. 随着 ...

  2. Python采集CSDN博客排行榜数据

    文章目录 前言 网络爬虫 搜索引擎 爬虫应用 谨防违法 爬虫实战 网页分析 编写代码 运行效果 反爬技术 前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知 ...

  3. oeasy教您玩转linux010106这儿都有啥 ls

    回忆上次内容 上个实验我们查询了 ls 的手册: man ls

  4. Collection/Map关系图

  5. 深入了解Kafka【一】概述与基础架构

    1.概述 Kafka是一个分布式的.基于发布订阅的消息系统,主要解决应用解耦.异步消息.流量削峰等问题. 2.发布订阅模型 消息生产者将消息发布到Topic中,同时有多个消息消费者订阅该消息,消费者消 ...

  6. 基于PHP实现CMS识别

    最近正在开发一款基于PHP实现的Web安全检测平台,写到了CMS识别这一功能,便写一篇文章总结一下. 首先需要梳理的是CMS识别的几种方法: 1.网页源代码特征:例如源代码中包含CMS的名称或是某种特 ...

  7. 6 年前,只会 JSP 和 Servlet 就可以找到工作

    这篇文章在去年就已经构思了,不过一直都没有整理出来,今天终于完成了这篇文章,所以发上来给大家看一看,都是一些个人的小感慨,我的观点可能不是非常的完善,大家也可以一起讨论. 找工作之难,难于上青天 五六 ...

  8. JS实现斐波那契数列的五种方式

    下面是五种实现斐波那契数列的方法 循环   function fibonacci(n){ var res1 = 1; var res2 = 1; var sum = res2; for(var i = ...

  9. Eclipse中java文件边的黄色数据库标志变成了蓝色小勾,导致文件修改后无法显示在Git staging窗口中,修改无法提交,怎么解决?

    出现这个问题的原因是误点击了右键点文件->Team->Advanced->Assume Unchanged, 导致结果是文件修改了无法显示在Git staging窗口中,自然无法提交 ...

  10. JZOJ1495 宝石

    Description 见上帝动了恻隐之心,天后也想显示一下慈悲之怀,随即从口袋中取出一块魔术方巾,让身边的美神维纳斯拿到后堂的屏风上去试试,屏风是正方形的,高和宽方向上各划有m条鱼屏风的边平行的直线 ...