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

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

不同点:栈(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. const定义的对象属性是否可以改变------是!

    用const声明person对象,给age重新赋值是没问题的 但是重新给person赋值是不可以的 这里需要了解'基本数据类型'和'引用数据类型' 基本数据类型:string, number, boo ...

  2. C# Chart各个属性详细解析、应用

    Chart笔记 前台页面代码: <form id="form1" runat="server"> <div> <asp:Chart ...

  3. The Triangle (简单动态规划)

    7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calc ...

  4. 对于分布式Job的思考

    引言 在清理Github的时候,发现以前写的一个简单的分布式任务分发系统ClawHub/task-distribution,使用了zk的选主与队列,调度器使用spring的ThreadPoolTask ...

  5. 如何编写一个简单的Linux驱动(一)

    前言 最近在学习Linux驱动,记录下自己学习的历程. 驱动的基本框架 Linux驱动的基本框架包含两部分,“模块入口.出口的注册”和“模块入口.出口函数的实现”,如下方代码. static int ...

  6. Nginx 路由--Location的使用

    一. 路由--Location的使用 9.1. Location语法规则 语法规则: location [=|~|~*|^~] /uri/ {… } 首先匹配 =,其次匹配^~,其次是按文件中顺序的正 ...

  7. python根据密钥得到谷歌两步验证动态验证码

    # coding=utf-8 import time import base64 import sys import hashlib import hmac import struct def goo ...

  8. go http请求流程分析

    前言 golang作为常驻进程, 请求第三方服务或者资源(http, mysql, redis等)完毕后, 需要手动关闭连接, 否则连接会一直存在; 连接池是用来管理连接的, 请求之前从连接池里获取连 ...

  9. HTML标签语言一览表

    <html> ● 文件声明 让浏览器知道这是 html 文件 <head> ● 开头 提供文件整体资讯 <title> ● 标题 定义文件标题,将显示于浏览顶端 & ...

  10. oracle之二实例与数据库

    实例与数据库 1.Oracle 网络架构及应用环境 看PPT,Oracle结构的基本单元.术语 2.Oracle 体系结构    1)oracle server :database + instanc ...