【python3数据结构】队列queue

linkedList.py 见链表实现 

# -*- coding: utf-8 -*-
# @Date   : 2019/11/12
# @File   : myQueue.py

from linkedList import LinkedList, Node

# 固定容量
DEFAULT_CAPACITY = 10

class ArrayQueue(object):
    def __init__(self):
        self._data = [None] * DEFAULT_CAPACITY
        self._size = 0 # tail
        self._front = 0 # head
    def __len__(self):
        return self._size

    def first(self):
        if self._size == 0:
            raise Exception("Queue is Empty")
        return self._data[self._front]

    def dequeue(self):
        if self._size == 0:
            raise Exception("Queue is Empty")
        result = self._data[self._front]
        self._data[self._front] = None # dequeue 之后移动head指针
        self._front = (self._front + 1) % len(self._data)
        self._size = self._size - 1
        return result

    def enqueue(self, x):
        # 如果队列的容量超过固定容量时,就扩大为当前容量的2倍
        # 同时,重新处理front 和 tail 2个指针
        if self._size == len(self._data):
            self.resize(2 * len(self._data))
        # 插入 x
        pos = (self._front + self._size) % len(self._data)
        self._data[pos] = x
        self._size += 1

    def resize(self, cap):
        old = self._data
        self._data = [None] * cap
        walk = self._front
        for k in range(self._size):
            # 新的queue的位置
            self._data[k] = old[walk]
            # old 通过取模的形式 移动指针
            walk = (1 + walk) % len(old)
        self._front = 0


class LinkedListQueue(object):
    def __init__(self):
        # 起2个指针 头和尾指针
        self.head = None
        self.tail = None
        self.len = 0

    def enqueue(self, value):
        # 在尾指针增加新值
        new_node = Node(value)
        if self.tail is not None:
            self.tail.next = new_node
        else:
            self.head = new_node
        self.tail = new_node
        self.len += 1

    def dequeue(self):
        # 在头指针删除值
        if not self.is_empty():
            # point head to next node
            tmp = self.head
            self.head = self.head.next
            print("dequeue sucess")
            self.len -= 1
            return tmp
        else:
            raise ValueError("Empty QUEUE")

    def is_empty(self):
        if self.head is None and self.tail is None:
            return True
        else:
            return False

    def peek(self):
        return self.head.val

    def __len__(self):
        return self.len

    def print(self):
        node = self.head
        while node:
            print(node.val, end=" ")
            node = node.next
        print('')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值