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的更多相关文章

  1. STL学习笔记6 -- 栈stack 、队列queue 和优先级priority_queue 三者比较

    栈stack  .队列queue  和优先级priority_queue 三者比较 默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现 ...

  2. C++栈(stack)、队列(queue)、链表(list)的常用函数

    C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一 ...

  3. 利用栈Stack实现队列(Queue)

    实现说明: 入队时,将元素压入s1; 出队时,推断s2是否为空,如不为空,则直接弹出顶元素:如为空.则将s1的元素逐个"倒入"s2.把最后一个元素弹出并出队; 这个思路,避免了重复 ...

  4. 自定义栈Stack 和 队列Queue

    自定义栈 接口 package com.test.custom; public interface IStack<E> { E pop(); void push(E e); E peek( ...

  5. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  6. Java堆(heap)、栈(stack)和队列的区别

    Java里面Stack有两种含义: 一:数据结构 Stack,即java.util.Stack import java.util.Stack; import java.util.Iterator; i ...

  7. 模板 - 数据结构 - 栈/Stack

    普通的栈大家都会写,STL的栈据说默认实现方式是deque,没关系反正deque跑得飞快. 这里收录的是一些奇怪的栈,当然双栈实现的队列收录在队列里面. 对顶栈 众所周知,栈可以维护一系列前缀和,包括 ...

  8. python学习笔记——multiprocessing 多进程组件-队列Queue

    1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...

  9. python 3.x 学习笔记16 (队列queue 以及 multiprocessing模块)

    1.队列(queue) 用法: import queue q = queue.Queue() #先进先出模式 q.put(1) #存放数据在q里 作用: 1)解耦    2)提高效率 class qu ...

随机推荐

  1. RJ45连接器

    http://www.huilyn.com/path315.html      HBJ-6308ANLF http://www.hanrun.com/en/           HR971169C h ...

  2. 关于Tcpdump抓包总结

    一.简介 tcpdump是一个用于截取网络分组,并输出分组内容的工具.凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具 tcpdump提供了源代码,公开了接口, ...

  3. 2018ccpc湖南邀请赛后记

    第一次出省去打邀请赛,赛前给队友定的目标是打个铜,这样奖金就可以报销我们的伙食费了 5.12 热身赛,ak的心态冲进去,爆零逃出来 (为什么热身赛没有签到题啊),出来一度以为这场比赛要打铁,毕竟老远过 ...

  4. Compiling R-3.4.3 on CentOS 6.10 with GNU

    If you are compiling CentOS 6, you will notice that the R source will not compile without a updated ...

  5. spring XML配置参数替代properties文件

    xml中配置BEAN与参数 <bean id="beanXXX" class="com.benXXXX" init-method="initia ...

  6. BFC规范

    BFC规范 BFC规范是什么? BFC规范也叫块级格式化上下文.是指一个独立的容器. 如何触发BFC? 我们可以通过一下几种方式触发BFC 1.通过浮动触发:float(除none) 2.通过绝对\固 ...

  7. 自学python 2.

    1.T or F 1>1 or 3<4 or 4>5 and 2>1 and 9>8 or 7<6 t not 2>1 and 3<4 or 4> ...

  8. Elasticsearch入门之从零开始安装ik分词器

    起因 需要在ES中使用聚合进行统计分析,但是聚合字段值为中文,ES的默认分词器对于中文支持非常不友好:会把完整的中文词语拆分为一系列独立的汉字进行聚合,显然这并不是我的初衷.我们来看个实例: POST ...

  9. vim学习之安装YouCompleteMe

    YouCompleteMe号称vim最难安装的插件,是太低估它了,我觉得只是目前我遇到的最难安装的一个软件. YouCompleteMe是用c++写的,要想补全c-family需要用clang编译. ...

  10. C#窗口闪烁问题解决

    https://www.cnblogs.com/AndyDai/p/5203798.html 开发WinForm 程序时经常会遇到闪屏的问题,这会给用户造成很差的使用体验,所以必须妥善解决好这个问题. ...