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. (set)产生冠军 hdu2094

    产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. php中函数里面使用函数外面的变量

    一定要在函数里面声明为全局变量!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(不然会有问题,还是不报错的那种)

  3. rownum查询前N条记录

    在Oracle中,要按特定条件查询前N条记录,用个rownum就搞定了.——select * from emp where rownum <= 5 而且书上也告诫,不能对rownum用" ...

  4. 剑指Offer_编程题_13

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. class So ...

  5. SpringMVC+Shiro不拦截静态资源配置

    最近在弄SpringMVC与Shiro整合,发现如果将DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果DispatcherServlet改为拦截“/” ...

  6. Kafka权威指南 读书笔记之(五)深入Kafka

    集中讨论以下3 个有意思的话题 :• Kafka 如何进行复制:• Kafka 如何处理来自生产者和消费者的请求 :• Kafka 的存储细节,比如文件格式和索引. 集群成员关系 Kafka 使用 Z ...

  7. 浏览器内核 Trident Gecko Presto Webkit

    Trident内核:IE,MaxThon,TT,The World,360,搜狗浏览器等 Gecko内核:Netscape6及以上版本,FF,MozillaSuite/SeaMonkey等 Prest ...

  8. JMETER压力测试报错:JAVA.NET.BINDEXCEPTION: ADDRESS ALREADY IN USE: CONNECT

    最近在实现接口压力测试的时候遇到这样的一个问题 当线程数持续上升到一个点的时候,运行脚本的时候有很多报错,如图: java.net.BindException: Address already in ...

  9. MyBatis SQL语句操作Mysql

    本文记录使用Mybatis操作数据库时碰到的一些语句,供以后参考. 一,多条件查询 示意SQL语句:SELECT t_field1, t_field2 FROM table_name WHERE t_ ...

  10. GCC编译器原理(二)------编译原理一:目标文件

    一.目标文件 在 UNIX® 和 Linux® 中,任何事物都是文件.UNIX 和 Linux 编程实际上是编写处理各种文件的代码.系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和 ...