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 ...
随机推荐
- 有时候eclipse 导入maven项目 启动的时候回出现这样一个问题
严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catali ...
- CatBoost算法和调参
欢迎关注博主主页,学习python视频资源 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?co ...
- loadrunner / socket level data and wininet level data
s loadrunner录制脚本时,此网站证书无效/无法录制到脚本问题解决 http://www.51testing.com/html/64/497364-3569552.html lr录制后空白_l ...
- Openldap命令详解
Openldap 客户端常用管理命令 1.ldapadd -x: 简答认证方式 -W: 不需要在命令上写密码 ldapapp -x -D "cn=Manager,dc=suixingpay, ...
- JAVA核心技术I---JAVA基础知识(查漏补缺private,static)
一:private对于类和对象(同C++) private是只有这个类内部可以访问(类的成员函数和定义初始化) private是类之间的限制,而不是对对象的限制<重点> 同类对象是可以直接 ...
- cors解决跨域
什么是cors CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpReq ...
- 快速傅里叶变换(Fast Fourier Transform, FFT)和短时傅里叶变换(short-time Fourier transform,STFT )【资料整理】【自用】
1. 官方形象展示FFT:https://www.bilibili.com/video/av19141078/?spm_id_from=333.788.b_636f6d6d656e74.6 2. 讲解 ...
- Golang入门教程(十七)Linux/Windows下快速搭建和配置NSQ
前言 NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在GitHub,其当前最新版本是0.3.1版.NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消 ...
- solr简介与安装
solr简介: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索引 ...
- DBUtils数据库连接池
DBUtils pip install DBUtils 模式一: 为每个线程创建一个连接.(内部是通过threading.local实现的) 模式二: 创建一定个数的连接,所有线程都来连接池中获取.( ...