Bootstrap

数据结构(系列)

在Python中,列表(list)是一种基本的数据结构,它可以存储一系列的元素。列表是可变的,即可以对其进行增删改查操作。

栈(Stack)是一种具有特定限制的线性数据结构,在栈中,添加和删除元素只能在一端进行操作,这一端被称为栈顶。栈的特点是先进后出(LIFO,Last-In-First-Out),即最后进栈的元素最先出栈。

队列(Queue)也是一种线性数据结构,与栈不同的是,队列的元素从一端插入(称为队尾),从另一端删除(称为队首)。队列的特点是先进先出(FIFO,First-In-First-Out),即最先进入队列的元素最先出队列。

在Python中,可以使用列表来实现栈和队列的功能。

以上是基于列表的简单实现,实际上,Python提供了更高效的数据结构来实现栈和队列,分别是collections.deque(双向队列)queue.Queue

目录

数据结构:

列表:

栈:

基本代码

括号匹配问题:

队列

队列的实现:环形队列

队列的内置模块

双向队列 单向队列

类似于linux的tail命令


数据结构:

物理结构和逻辑结构

列表:

列表中的元素是怎么存储的:顺序存储。(一块连续的内存)

基本操作的时间复杂度:

a[2]:O(1)

append():O(1)

insert() remove() pop() :O(n)

数组和列表有两点不同:

  1. 数组的类型是相同的

  2. 数组长度固定

Python的列表是如何实现的?

栈:

基本代码

# 栈 封装成一个类
class Stack:
    def __init__(self):
        self.stack = []
​
    def push(self,element):
        self.stack.append(element)
​
    def pop(self):
        return self.stack.pop()
​
    def get_top(self):
        if len(self.stack) > 0:
            return self.stack[-1]
        else:
            return None
​
​
stack = Stack()
stack.push(0)
stack.push(1)
stack.push(2)
print(stack.pop())

括号匹配问题:

# 匹配问题
'''
string = input()
stack = []
match = {'}':'{',')':'(',']':'['}
for char in string:
    if char in {'(','{','['}:       # 集合
        stack.append(char)
    else:
        if len(stack) == 0 or stack.pop() != match[char]:
            print('False')
            break
if len(stack) == 0:
    print('True')
'''

队列

队列的实现:环形队列

class Queue:
    def __init__(self,size = 100):
        self.queue = [0 for _ in range(size)]
        self.size = size
        self.rear = 0       # 队尾指针
        self.front = 0      # 队首指针
​
    def push(self,element):
        if not self.is_filled():
            self.rear = (self.rear + 1) % self.size
            self.queue[self.rear] = element
        else:
            raise IndexError("queue is filled.")
​
    def pop(self):
        if not self.is_empty():
            self.front = (self.front + 1) % self.size
            return self.queue[self.front]
        else:
            raise IndexError("Queue is empty.")
​
    # 判断队空
    def is_empty(self):
        return self.rear == self.front
​
    # 判断队满
    def is_filled(self):
        return (self.rear+1) % self.size == self.front
​
​
q = Queue(5)
# 长度是5,只能存储4个数
q.push(4)
q.push(6)
q.push(5)
q.push(6)
print(q.pop())

队列的内置模块

双向队列 单向队列
# 队列内置模块
​
from collections import deque
​
q = deque([1,2,3,4],5)          # 第二个可选参数 5 代表最长长度如果队满直接默认队首出队
#单向
q.append(1)         # 队尾进队
print(q.popleft())        # 队首出队
​
# 双向队列
# q.appendleft(1)     # 队首进队
# q.pop()     # 队尾出队
类似于linux的tail命令

取后n个

from collections import deque
​
def tail(n):
    with open('test.txt','r') as f:
        q = deque(f,n)
        return q
​
​
print(tail(5))

以上是基于列表的简单实现,实际上,Python提供了更高效的数据结构来实现栈和队列,分别是collections.dequequeue.Queue(多线程安全队列)

;