-
Notifications
You must be signed in to change notification settings - Fork 50
/
deck.py
107 lines (85 loc) · 3.23 KB
/
deck.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
"""
ПРИНЦИП РАБОТЫ
Дек, максимальный размер которого определяется заданным числом.
ДОКАЗАТЕЛЬСТВО КОРРЕКТНОСТИ
Структура, объединяющая стек и очередь,
называется дек (англ. deque - сокращение от double-ended queue, очередь с двумя концами).
Она поддерживает набор операций:
- Добавить элемент в начало дека;
- Извлечь элемент из начала дека;
- Добавить элемент в конец дека;
- Извлечь элемент из конца дека;
- Проверить, пуст ли дек;
- Проверить, полон ли дек.
Статья - https://brestprog.by/topics/datastructures/.
ВРЕМЕННАЯ СЛОЖНОСТЬ
Добавление в дек стоит O(1).
Извлечение из дека стоит O(1).
Проверить, пуст ли дек стоит O(1).
Проверить, полон ли дек стоит O(1).
ПРОСТРАНСТВЕННАЯ СЛОЖНОСТЬ
Дек, максимальный размер которого определяется заданным числом k, занимает O(k) памяти.
"""
class NoItemsException(Exception):
def __init__(self):
pass
class MaxItemsException(Exception):
def __init__(self):
pass
class Deck:
def __init__(self, max_size):
self._array = [None] * max_size
self._max_size = max_size
self._size = 0
self._head = 0
self._tail = -1
@property
def is_full(self):
return self._size == self._max_size
@property
def is_empty(self):
return self._size == 0
def push_back(self, value):
if self.is_full:
raise MaxItemsException
else:
self._tail = (self._tail + 1) % self._max_size
self._array[self._tail] = value
self._size += 1
def push_front(self, value):
if self.is_full:
raise MaxItemsException
else:
self._head = (self._head - 1) % self._max_size
self._array[self._head] = value
self._size += 1
def pop_back(self):
if self.is_empty:
raise NoItemsException
else:
value = self._array[self._tail]
self._tail = (self._tail - 1) % self._max_size
self._size -= 1
return value
def pop_front(self):
if self.is_empty:
raise NoItemsException
else:
value = self._array[self._head]
self._head = (self._head + 1) % self._max_size
self._size -= 1
return value
n = int(input())
m = int(input())
deck = Deck(m)
for _ in range(n):
try:
cmd = input().split(' ')
if len(cmd) == 1:
print(getattr(deck, cmd[0])()) # Если бы не вывод, то getattr(deck, cmd[0])(*cmd[1:])
else:
getattr(deck, cmd[0])(cmd[1])
except NoItemsException:
print('error')
except MaxItemsException:
print('error')