LinkedListQueue   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 37
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 37
rs 10
wmc 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A size() 0 2 1
A iterate() 0 6 2
A enqueue() 0 8 3
A is_empty() 0 2 1
A dequeue() 0 9 3
1
from abc import abstractmethod, ABCMeta
2
3
4
class Queue(object):
5
    """ Queue interface
6
    
7
    """
8
9
    __metaclass__ = ABCMeta
10
11
    @abstractmethod
12
    def enqueue(self, item):
13
        pass
14
15
    @abstractmethod
16
    def dequeue(self):
17
        pass
18
19
    @abstractmethod
20
    def is_empty(self):
21
        pass
22
23
    @abstractmethod
24
    def size(self):
25
        pass
26
27
    @staticmethod
28
    def create():
29
        return LinkedListQueue()
30
31
    @abstractmethod
32
    def iterate(self):
33
        pass
34
35
36
class Node(object):
37
38
    value = None
39
    nextNode = None
40
41
    def __init__(self, value):
42
        self.value = value
43
44
45
class LinkedListQueue(Queue):
46
47
    first = None
48
    last = None
49
    N = 0
50
51
    def size(self):
52
        return self.N
53
54
    def iterate(self):
55
        x = self.first
56
        while x is not None:
57
            value = x.value
58
            x = x.nextNode
59
            yield value
60
61
    def enqueue(self, item):
62
        old_last = self.last
63
        self.last = Node(item)
64
        if old_last is not None:
65
            old_last.nextNode = self.last
66
        if self.first is None:
67
            self.first = self.last
68
        self.N += 1
69
70
    def is_empty(self):
71
        return self.N == 0
72
73
    def dequeue(self):
74
        if self.is_empty():
75
            return None
76
        old_first = self.first
77
        self.first = old_first.nextNode
78
        if old_first == self.last:
79
            self.last = None
80
        self.N -= 1
81
        return old_first.value
82
83
84
class ArrayQueue(Queue):
85
86
    head = 0
87
    tail = 0
88
    s = []
89
90
    def __init__(self, capacity=None):
91
        if capacity is None:
92
            capacity = 10
93
        self.s = [0] * capacity
94
95
    def iterate(self):
96
        if self.is_empty():
97
            return
98
        for i in range(self.head, self.tail):
99
            yield self.s[i]
100
101
    def enqueue(self, item):
102
        self.s[self.tail] = item
103
        self.tail += 1
104
        if self.tail == len(self.s):
105
            self.resize(len(self.s) * 2)
106
107
    def resize(self, new_size):
108
        tmp = [0] * new_size
109
        for i in range(self.head, self.tail):
110
            tmp[i-self.head] = self.s[i]
111
        self.s = tmp
112
        self.tail = self.tail - self.head
113
        self.head = 0
114
115
    def size(self):
116
        return self.tail - self.head
117
118
    def is_empty(self):
119
        return self.size() == 0
120
121
    def dequeue(self):
122
        if self.is_empty():
123
            return None
124
125
        deleted = self.s[self.head]
126
        self.head += 1
127
        if self.size() == len(self.s) // 4:
128
            self.resize(len(self.s) // 2)
129
        return deleted
130