StackNode   A
last analyzed

Complexity

Total Complexity 1

Size/Duplication

Total Lines 6
Duplicated Lines 0 %

Importance

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

1 Method

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