栈和队列python实现

一、栈

        一个数据集合,只能在一端进行插入或删除操作的列表。

        特点:后进先出

        功能实现:

                        进栈:li.append()

                        出栈:li.pop()

                        取栈顶:li[-1]

                        栈的图解:

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

    def is_empty(self):    # 判断栈是否为空
        return len(self.stack) == 0

二、队列

        一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。进行插入的一端叫队尾(rear),插入动作成为进队或入队,进行删除的一端叫做队首(front),删除动作叫做出队。

        性质:先进先出

1、队列的实现方式---环形队列

        刚开始,rear 和 front 同时指向 0 位置,每进队一个数,rear 往后移动一个位置。出队一个数,front 往后移动一个位置。为了不与队空条件判定发生矛盾,特意空出一个位置,令rear + 1 = front 时为队满。

        

环形队列:当队尾指针front == Maxsize - 1 时,再前进一个位置自动到0.

队首指针前进1:front = (front + 1) % Maxsize

队尾指针前进1:rear = (rear + 1) % Maxsize

队空条件:rear == front

队满条件:(rear + 1) % Maxsize == front

2、代码实现

class Queue:
    def __init__(self, size=100):
        self.queue = [0 for i 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

    def __str__(self):
        return 'Queue: ' + str(self.queue)


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

3、队列python内置模块

# 队列的内置模块(双向队列)
# 双向队列   队首队尾都可以进行出队和入队操作
from collections import deque

# 创建一个队列
q = deque([参数1, 参数2)  # 参数1表示要进队的列表,参数2表示队列的最大长度,到最大长度以后前面的元素自动出队,如果不写参数默认创建空队列。

# 单向队列
q.append(参数)  # 队尾进队  参数表示要进队的数
q.popleft()  # 队首出队
#
# 用于双向队列
q.appendleft(参数)   # 队首进队   参数表示要进队的数
q.pop()   # 队尾出队

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值