-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathArray.py
129 lines (99 loc) · 3.2 KB
/
Array.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
class Array:
def __init__(self, arr=None, capacity=10):
if isinstance(arr, list):
self._data = arr[:]
self._size = len(arr)
return
self._data = [None] * capacity
self._size = 0
def get_size(self):
return self._size
def get_capacity(self):
return len(self._data)
def is_empty(self):
return self._size == 0
def add_last(self, e):
self.add(self._size, e)
def add_first(self, e):
self.add(0, e)
def add(self, index, e):
"""从后往前"""
if self._size == len(self._data):
if self._size == 0:
self._resize(1)
else:
self._resize(2 * len(self._data))
if not 0 <= index <= self._size:
raise ValueError(
'add failed. Require index >= 0 and index <= array {}'.format(self._size))
for i in range(self._size - 1, index - 1, -1):
self._data[i + 1] = self._data[i]
self._data[index] = e
self._size += 1
def _resize(self, new_capacity):
new_data = [None] * new_capacity
for i in range(self._size):
new_data[i] = self._data[i]
self._data = new_data
def __str__(self):
return str(
'<chapter_04_Array.array.Array> : {}, capacity: {}'.format(self._data[:self._size], self.get_capacity()))
def __repr__(self):
return self.__str__()
def get(self, index):
if not 0 <= index < self._size:
raise ValueError('get failed. Index is illegal.')
return self._data[index]
def get_last(self):
return self.get(self._size - 1)
def get_first(self):
return self.get(0)
def set(self, index, e):
if not 0 <= index < self._size:
raise ValueError('set failed. Index is illegal.')
self._data[index] = e
def contains(self, e):
for i in range(self._size):
if self._data[i] == e:
return True
return False
def find_index(self, e):
for i in range(self._size):
if self._data[i] == e:
return i
return -1
def remove(self, index):
if index < 0 or index >= self._size:
raise ValueError("Remove is failed, index is illegal")
ret = self._data[index]
for i in range(index, self._size - 1):
self._data[i] = self._data[i + 1]
self._size -= 1
if (self._size == len(self._data) // 4 and len(self._data) // 2 != 0):
self._resize(len(self._data) // 2)
return ret
def remove_first(self):
return self.remove(0)
def remove_last(self):
return self.remove(self._size - 1)
def remove_element(self, e):
index = self.find_index(e)
if index != -1:
self.remove(index)
if __name__ == '__main__':
arr = Array(10)
for i in range(11):
arr.add_last(i)
print(arr.get_capacity())
print(arr.get_size())
print(arr)
arr.add(1, 'zwang')
print(arr)
arr.remove_element('zwang')
print(arr)
arr.add_first(-1)
print(arr)
arr.remove_element(8)
print(arr)
arr.remove_element('zhe')
print(arr)