【Python】链表、队列、栈
来源:互联网 发布:淘宝压缩图片 编辑:程序博客网 时间:2024/05/14 15:34
链表的定义:
链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址。由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列。也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域;另一部分用于存储下一个数据元素地址的指针,称为指针域。链表中的第一个结点的地址存储在一个单独的结点中,称为头结点或首结点。链表中的最后一个结点没有后继元素,其指针域为空。
一、单链表
在C++中是利用指针完成相关的操作,在Python里可以创建一个Node类来实现,用类的属性来代替指针
- 单链表的建立、打印、测长、删除节点、插入、排序、逆置
class Node(object): # Node类有value和next两个属性 def __init__(self,value,next=None): self.value=value # 存放数据元素 self.next=next # next是下一个节点的标识def create_list(n): # 建立单链表 if n<=0: return False if n==1: return Node(1) else: root=Node(1) tmp=root for i in range(2, n+1): tmp.next=Node(i) tmp=tmp.next return rootdef print_list(head): # 打印单链表 p=head while p!=None: print(p.value) p=p.nextdef len_list(head): # 链表长度 c=0 p=head while p!=None: c=c+1 p=p.next return cdef del_list(head,n): # 删除链表 if n<1 or n>len_list(head): return head elif n is 1: ''' Python中的对象包含三要素:id、type、value 其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值 is判断的是a对象是否就是b对象,是通过id来判断的 ==判断的是a对象的值是否和b对象的值相等,是通过value来判断的 ''' head=head.next # head指向P1,删除index=1以后,head指向P2; else: p=head for i in range(1,n-1): p=p.next q=p.next # n=4时,p.next指向4 p.next=q.next # q.next指向5,并放在3后面 return headdef insert_list(head,n): # 插入 if n<1 or n>len_list(head): return p=head for i in range(1,n-1): p=p.next t=Node(5) #设定插入的值 t.next=p.next p.next=t return headdef sort_list(head): if head is None: return right=head.next # left的值大于right,值互换 while right is not None: left=head right_val=right.value while left is not right: if left.value<=right_val: pass else: left.value,right_val=right_val,left.value left=left.next right.value=right_val right=right.nextdef reverse_list(head): # 逆置 p1=None p2=head while(p2 is not None): tmp=p2.next p2.next=p1 p1=p2 p2=tmp return p1if __name__=='__main__': n=8 head=create_list(n) print_list(head) print("___________________________") print("删除后的list:") n1=4 del_list(head,n1) print_list(head) print("___________________________") print("插入后的list:") n = 8 head = create_list(n) n2=4 insert_list(head,n2) print_list(head) print("___________________________") print("排序后的list:") sort_list(head) print_list(head)
二、双链表
双链表的情况和单链表类似,只是增加了一个前置链而已
- 双链表的建立、删除节点、插入节点
class Node(object): def __init__(self, value=None): self._prev = None self.data = value self._next = None def __str__(self): return "Node(%s)" % self.dataclass DoubleLinkedList(object): def __init__(self): self._head = Node() def insert(self, value): element = Node(value) element._next = self._head self._head._prev = element self._head = element def search(self, value): if not self._head._next: raise ValueError("the linked list is empty") temp = self._head while temp.data != value: temp = temp._next return temp def delete(self, value): element = self.search(value) if not element: raise ValueError('delete error: the value not found') element._prev._next = element._next element._next._prev = element._prev return element.data def __str__(self): values = [] temp = self._head while temp and temp.data: values.append(temp.data) temp = temp._next return "DoubleLinkedList(%s)" % values
三、队列(queue)
队列也是表,使用队列时插入在一端进行而删除在另一端进行
- 入队(enqueue):在表的末端队尾(rear)插入一个元素
- 出队(dequeue):删除(并返回)表的开头队头(front)的元素
class Queue(object): def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def enqueue(self,item):# 入队 self.items.insert(0,item) def dequeue(self):# 出队 return self.items.pop() def size(self): return len(self.items)if __name__=='__main__': q=Queue() q.enqueue('Apple') q.enqueue('Sumsung') q.enqueue('Xiaomi') print(q.dequeue()) print('--------------------') print(q.isEmpty()) print('--------------------') print(q.size())
四、栈(stack)
栈是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征;
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top);
基本操作有进栈(push)和出栈(pop)
class Stack(object): def __init__(self): self._top = 0 self._stack = [] def push(self, data): self._stack.insert(self._top, data) self._top += 1 def pop(self): if self.isEmpty(): raise ValueError('stack 为空') self._top -= 1 data = self._stack[self._top] return data def isEmpty(self): if self._top == 0: return True else: return False def __str__(self): return "Stack(%s)"%self._stack
阅读全文
1 0
- 【Python】链表、队列、栈
- Python队列、栈学习
- python中的队列、栈
- Python 栈和队列
- 栈+队列--python
- Python中的堆栈、队列、链表
- python中的队列和栈
- Python模拟栈 和 队列
- python实现栈和队列
- python数据结构---栈和队列
- Python实现栈和队列
- Python 实现双链表,栈,队列
- Python数据结构之列表、栈、队列、链表、字典
- python 队列
- Python- 队列
- python 队列
- Python-队列
- Python 队列
- 解决office预览问题,jaboc,iText的运用
- 【阈值优化】BZOJ1257(CQOI2007)[余数之和sum]
- PMCAFF转载——网易云课堂产品研习
- 原理总结-struts
- 2017 Multi-University Training Contest
- 【Python】链表、队列、栈
- Jump Game 和Jump Game II---LeetCode
- Laravel5.4注册登录解析及使用教程
- JVM——Java虚拟机的浅析
- 对比Java.nio 和 Java.io
- 51. N-Queens
- 信息化实践的思想
- 2017.8.19~8.20 noip 模拟 day2
- 轻松学JVM(四)——垃圾回收算法