python基本数据结构栈stack和队列queue
1,栈,后进先出,多用于反转
Python里面实现栈,就是把list包装成一个类,再添加一些方法作为栈的基本操作。
栈的实现:
class Stack(object):
#初始化栈为空列表
def __init__(self):
self.items = [] #self.__items = []可以把items变成私有属性 #判断栈是不是为空
def isEmpty(self):
return len(self.items) ==0 #返回栈顶的元素
def peek(self):
return self.items[-1] #返回栈的大小
def size(self):
return len(self.items) #给栈加入新元素
def push(self,a):
self.items.append(a) #删除栈顶的元素
def pop(self):
return self.items.pop()
栈应用实例:十进制转化为二进制
def divideBy2(decNumber):
remstack = Stack() #实例化一个栈,因为需要栈结构来存储数据,也是为了用到栈方法 while decNumber > 0:
rem = decNumber%2 #除二倒取余法,最后反转拼接所有的余数
remstack.push(rem) #余数依次放到栈中储存起来
decNumber = decNumber // 2 binstring = ''
while not remstack.is_empty():
binstring = binstring + str(remstack.pop()) #反序获取栈中的元素 return binstring print divideBy2(10)
2 队列queue
队列实际上就是一个包装了的列表,从list[0]添加新元素,用pop()来获取,符合先进先出的规则。
class Queue:
def __init__(self):
self.items = [] def isEmpty(self):
return self.items == [] def enqueue(self,item): #添加一个新元素item到队列的开头,这叫队尾
self.items.insert(0,item) def dequeue(self): #减去一个最后一个元素,这叫队首
return self.items.pop() def size(self):
return len(self.items) def show(self): #自主添加的,好跟踪查看队列里有啥
return self.items
队列应用实例:热土豆
#就是一队人围着圈报数,从0开始,报到m就出局,看谁活最久。
from pythonds.basic.queue import Queue def HotPotato(namelist,num):
simqueue = Queue()
for name in namelist:
simqueue.enqueue(name) #把先namelist添加到队列中去,ps:从下标是0的位置开始添加,整个插入完成以后序列就反过来了
while simqueue.size()>1:
for i in range(num): #
simqueue.enqueue(simqueue.dequeue())
#从列表的末尾减去什么就把什么添加到列表开头
simqueue.dequeue() #哪个排最后哪个就是热土豆,直接出局
return simqueue.dequeue() print HotPotato(['lili','jiajia','dahu','wangba','daqing','tamato','potato','hehe'],3)
3 双端队列有点类似于列表,不多赘述
4,链表
基本链表的实现: #链表是环环相扣形成的序列结构,每一环首先定义self变量,其次要标记下一个变量。所以访问的时候只能按照顺序来。
class Node:
def __init__(self,initdata):
self.data = initdata
self.next = None def getData(self):
return self.data def getNext(self):
return self.next def setData(self,newdata):
self.data = newdata def setNext(self,newnext):
self.next = newnext
无序链表:
class UnorderedList:
def __init__(self):
self.head = None #表示链表的头部不引用任何内容
def isEmpty(self):
return self.head == None
def add(self,item): #链表中有两个属性,一个是本身,一个是next,
temp = Node(item) #这个设定了链表本身,也就是data,无序链表也是由node构成的
temp.setNext(self.head) #这个设定了next
self.head = temp #把链表的data参数设定为无序列表的头----head
def size(self):
current = self.head
count = 0
while current != None:
count = count +1
current = current.getNext()
return count
def search(self,item):
current = self.head
found = False
while current != None and not found:
if current.getData() == item:
found = True
else:
current = current.getNext()
return found
def remove(self,item):
current = self.head
previous=None
found = False
while not found: #找到要删除的item以后会跳出循环,此时current.getData()是要删除的项目
if current.getData()==item:
found=True
else:
previous=current
current=current.getNext()
if previous ==None: #只有一种情况下,previous会是None,那就是要删除的是第一个,也就是想删除self.head
self.head=current.getNext()
else:
previous.setNext(current.getNext()) # 本来的指向是previous.getData()--item(也就是previous.getNext(),还是current.getData())--current.getNext()
#要想删除item,那就把previous的指向改成current.getNext(),这样item就不能在原来的链表中瞎掺和了
有序链表:
class OrderedList:
def __init__(self):
self.head = None def isEmpty(self): #同无序列表
return self.head == None def show(self):
current = self.head
while current != None:
print current.getData()
current = current.getNext() def __iter__(self):
current = self.head
while current != None:
yield current.getData()
current = current.getNext() def size(self): #同无序列表
current = self.head
count = 0
while current != None:
count +=1
current =current.getNext()
return count def search(self,item): #默认从小到大排列的链表
current = self.head
found = False
stop = False
while current != None and not found and not stop:
if current.getData() == item:
found = True
else:
if current.getData() > item:
stop = True
else:
current = current.getNext()
return found def add(self,item):
current = self.head
previous = None
stop = False
while current != None and not stop: #有一个以上元素的情况
if current.getData() > item:
stop = True
else:
previous = current
current = current.getNext() #不用担心元素添加到最后的情况,因为链表中自带None封住了两头 temp = Node(item)
if previous == None: #添加到链表头的情况
temp.setNext(self.head)
self.head=temp
else:
temp.setNext(current)
previous.setNext(temp) def remove(self, item):
current = self.head
previous = None
found = False
while not found:
# 迭代每一项,得到要删除的那个,并且通过赋值前一个执行删除
if current.getData() == item:
found = True
else:
previous = current
current = current.getNext()
if previous == None:
# 如果删除的是第一项,那么把第二项变成第一项,否则给previous赋值
self.head = current.getNext()
else:
previous.setNext(current.getNext())
python基本数据结构栈stack和队列queue的更多相关文章
- STL学习笔记6 -- 栈stack 、队列queue 和优先级priority_queue 三者比较
栈stack .队列queue 和优先级priority_queue 三者比较 默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现 ...
- C++栈(stack)、队列(queue)、链表(list)的常用函数
C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一 ...
- 利用栈Stack实现队列(Queue)
实现说明: 入队时,将元素压入s1; 出队时,推断s2是否为空,如不为空,则直接弹出顶元素:如为空.则将s1的元素逐个"倒入"s2.把最后一个元素弹出并出队; 这个思路,避免了重复 ...
- 自定义栈Stack 和 队列Queue
自定义栈 接口 package com.test.custom; public interface IStack<E> { E pop(); void push(E e); E peek( ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- Java堆(heap)、栈(stack)和队列的区别
Java里面Stack有两种含义: 一:数据结构 Stack,即java.util.Stack import java.util.Stack; import java.util.Iterator; i ...
- 模板 - 数据结构 - 栈/Stack
普通的栈大家都会写,STL的栈据说默认实现方式是deque,没关系反正deque跑得飞快. 这里收录的是一些奇怪的栈,当然双栈实现的队列收录在队列里面. 对顶栈 众所周知,栈可以维护一系列前缀和,包括 ...
- python学习笔记——multiprocessing 多进程组件-队列Queue
1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...
- python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)
1.队列(queue) 用法: import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里 作用: 1)解耦 2)提高效率 class qu ...
随机推荐
- ES6优缺点
看了一篇ES6语法示例,觉得还可以 here ES6是新一版的标准,对语言有扩展,添加了新的属性与方法.这一标准虽然现在还要用babel来做浏览器支持(将ES6编译成ES5才能被浏览器支持),但是未来 ...
- H5新增元素
标签 标记意义及用法分析/示例 属性/属性值/描述 <article> 定义独立的内容,如论坛帖子.报纸文章.博客条目.用户评论等内容. 支持HTML5的全局属性和事件属性. <as ...
- Windows下MySQL下载安装、配置与使用
用过MySQL之后,不论容量的话,发现比其他两个(sql server .oracle)好用的多,一下子就喜欢上了.下面给那些还不知道怎么弄的童鞋们写下具体的方法步骤. (我这个写得有点太详细了,甚至 ...
- Excel:11个查询函数组合
还不懂?上栗子~ 1.普通查找 根据表二中的姓名,查找表一对应的应发工资.最基础的VLOOKUP函数就能搞定. 2.反向查找 根据表二姓名,查找表一编号.但表一中编号列在姓名列之前,无法直接使用VLO ...
- Tornado基于MiddleWare做中间件
详细代码如下: 在app.py里添加 # -*- coding:utf-8 -*- from tornado.ioloop import IOLoop from tornado.web import ...
- 使用Redis模拟简单分布式锁,解决单点故障的问题
需求描述: 最近做一个项目,项目中有一个功能,每天定时(凌晨1点)从数据库中获取需要爬虫的URL,并发送到对应的队列中,然后客户端监听对应的队列,然后执行任务.如果同时部署多个定时任务节点的话,每个节 ...
- 【JQ】jq动态绑定事件.on()、解绑事件off()
#JQ 绑定与解绑事件的方法的历史演变 1. jquery1.4 及之前的版本,由.click() 或 .bind()方法绑定的事件,不能适用脚本创建的新元素:即是说页面加载完成后,再动态创建的DOM ...
- python 面向对象(一)初识面向对象
##################################总结#################### 1. 面向过程:一切以事物的发展流程为中心 面向对象:一切以对象为中心,一切皆为对向, ...
- bootstrap实现checkbox全选、取消全选
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- 最新版本的 ...
- HDU - 3642 Get The Treasury(线段树求体积交)
https://cn.vjudge.net/problem/HDU-3642 题意 求立方体相交至少3次的体积. 分析 三维的呢..首先解决至少覆盖三次的问题.则用三个标记,更新时的细节要注意. 注意 ...