数据结构——栈和队列(python实现)

数据结构

列表

python中的列表是如何存储的

python中的对列表的插入删除(insert,remove)的时间复杂度为O(n)

python实现栈

python 复制代码
class Stack:
    """ python实现栈 """

    def __init__(self):
        self.stack = []

    def push(self, item):
        self.stack.append(item)

    def pop(self):
        if len(self.stack) != 0:
            return self.stack.pop()
        return None

    def peek(self):
        if len(self.stack) != 0:
            return self.stack[-1]
        return None

括号匹配问题

python 复制代码
# 1. 括号匹配   "{}()(({[]}))"    ""
def brace_match(s):
    match = {')': '(', ']': '[', '}': '{'}
    stack = Stack()
    for i in s:
        if i in {'(', '{', '['}:
            stack.push(i)
        else:
            if stack.is_empty():
                return False
            elif stack.peek() == match[i]:
                stack.pop()
            else:
                return False
    if stack.is_empty():
        return True
    return False


print(brace_match("{}"))
print(brace_match("{}()((}}"))
print(brace_match("{}()(({[]}))"))
print(brace_match("{}()(({[[]}))"))

队列

队列怎么实现

队列的实现可以通过简单的列表实现吗:

如果只是通过列表简单实现,那么出去一个元素就要将剩下的元素整体迁移,时间复杂度就是O(n)。

python实现队列

python 复制代码
class Queue:
    """ python实现队列 """

    def __init__(self, size):
        self.queue = [0 for _ in range(size)]
        self.size = size
        self.front = 0
        self.rear = 0

    def is_empty(self):
        return self.front == self.rear

    def is_full(self):
        return (self.rear + 1) % self.size == self.front

    def push(self, item):
        if not self.is_full():
            self.rear = (self.rear + 1) % self.size
            self.queue[self.rear] = item
        else:
            raise ImportError('Queue is full')

    def pop(self):
        if not self.is_empty():
            self.front = (self.front + 1) % self.size
            return self.queue[self.front]
        else:
            raise ImportError('Queue is empty')


q = Queue(5)
for i in range(4):
    q.push(i)

print(q.is_full())
print(q.pop())
print(q.pop())
print(q.pop())
print(q.pop())

双向队列

python内置的队列模块 deque

python 复制代码
""""""
"""
deque 是一个 双向列表
append 从右入队
popleft 从左出队
appendleft 从左入队
pop 从右出队

入队时队列满的话: 自动将入队方向另一边的值出队

由此,就可以通过deque快速实现一个类似于linux中tail的命令
q = deque(f, s)
相当于创建了一个定长的队列,让后循环句柄入队,前面的就都被出队了
"""
from collections import deque

q = deque(maxlen=3)
q.append(2)
q.appendleft(1)
q.append(3)
print(q)
q.appendleft(0)
print(q)
q.append(3)
print(q)


# deque快速实现tail的命令
def tail(s):
    with open('test.txt', 'r') as f:
        q = deque(f, s)
    print(q)
    for line in q:
        print(line, end='')


tail(3)

若有错误与不足请指出,关注DPT一起进步吧!!!

相关推荐
萧鼎39 分钟前
【Python】高效数据处理:使用Dask处理大规模数据
开发语言·python
武子康1 小时前
大数据-187 Elasticsearch - ELK 家族 Logstash Filter 插件 使用详解
大数据·数据结构·elk·elasticsearch·搜索引擎·全文检索·1024程序员节
互联网杂货铺1 小时前
Python测试框架—pytest详解
自动化测试·软件测试·python·测试工具·测试用例·pytest·1024程序员节
Ellie陈1 小时前
Java已死,大模型才是未来?
java·开发语言·前端·后端·python
菜鸟的人工智能之路1 小时前
ROC 曲线:医学研究中的得力助手
python·数据分析·健康医疗
梦幻精灵_cq1 小时前
python包结构模块如何有效传递数据?
python
黑叶白树2 小时前
包和模块(上) python复习笔记
开发语言·笔记·python
韭菜盖饭3 小时前
LeetCode每日一题3211---生成不含相邻零的二进制字符串
数据结构·算法·leetcode
czme3 小时前
线程和进程
linux·数据结构·计算机网络
铁盒薄荷糖3 小时前
【Pytorch】Pytorch的安装
人工智能·pytorch·python