Структура данных стека в python
У меня есть 2 проблемы с кодом ниже:
- push (o) выдает исключение TypeError: может назначать только итерацию.
-
Должен ли я вызывать исключение, если pop() вызывается в пустом стеке?
class Stack(object):
def __init__(self):
self.storage = []
def isEmpty(self):
return len(self.storage) == 0
def push(self,p):
self.storage[:0] = p
def pop(self):
"""issue: throw exception?"""
return None
Ответы
Ответ 1
Не нужно прыгать через эти циклы, см. 5.1.1 Использование списков в виде стеков
Если вы настаиваете на использовании методов isEmpty()
и push()
, вы можете сделать:
class stack(list):
def push(self, item):
self.append(item)
def isEmpty(self):
return not self
Ответ 2
Вы правы в использовании композиции вместо наследования, потому что наследование приводит методы, которые вы не хотите раскрывать.
class Stack:
def __init__(self):
self.__storage = []
def isEmpty(self):
return len(self.__storage) == 0
def push(self,p):
self.__storage.append(p)
def pop(self):
return self.__storage.pop()
Таким образом, ваш интерфейс работает примерно так же, как list
(например, такое же поведение на pop
), за исключением того, что вы заблокировали его, чтобы никто не вмешивался в внутренности.
Ответ 3
Я не буду говорить о структуре списка, как это уже было рассмотрено в этом вопросе. Вместо этого я упомянул о своем предпочтительном методе работы со стеками:
Я всегда использую модуль Queue
. Он поддерживает структуры данных FIFO и LIFO и является потокобезопасным.
Подробнее см. документы. Он не реализует функцию isEmpty()
, вместо этого возникает исключение Full
или Empty
, если невозможно выполнить push или pop.
Ответ 4
Стек следует за механизмом LIFO. Вы можете создать список и сделать обычный append()
, чтобы добавить список элементов и сделать pop()
, чтобы извлечь элемент из списка, который вы только что вставили.
Ответ 5
Вот пример класса стека
class Stack(object):
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[-1]
def isEmpty(self):
return len(self.items) == 0
Ответ 6
class Stack:
def __init__(self):
self.items=[]
def isEmpty(self):
return self.items==[]
def push(self , item):
self.items.append(item)
def pop(self):
return self.items.pop()
def size(self):
return len(self.items)
def peek(self):
return self.items[-1]
Создать стек
Для создания нового стека мы можем просто использовать Stack()
например:
s=Stack()
"s" - это имя нового стека
пустой
Используя isEmpty()
мы можем проверить, что наш стек пуст или нет
например:
у нас есть два стека с именем s1 = (0,1,4,5,6) и s2 =()
если мы используем print(s1.isEmpty())
он вернет False
если мы используем print(s2.isEmpty())
он вернет True
От себя
Используя операцию push, мы можем добавлять элементы в начало стека.
мы можем добавить "6" к имени стека "s", используя
s.push(6)
поп
мы можем использовать операцию pop для удаления и возврата верхнего элемента стека
если есть имя стека "s" с n количеством элементов (n> 0), мы можем удалить его сверху большинства элементов, используя
s.pop()
размер
Эта операция вернет сколько элементов в стеке
если есть имя стека "s" s = (1,2,3,4,5,3)
print(s.size())
вернет "6"
peek Эта операция возвращает верхний элемент, не удаляя его
print(s.peek())
"мы можем напечатать элементы стека, используя print(s.items)
"
Ответ 7
class Stack:
def __init__(self):
self.stack = []
def pop(self):
if self.is_empty():
return None
else:
return self.stack.pop()
def push(self, d):
return self.stack.append(d)
def peek(self):
if self.is_empty():
return None
else:
return self.stack[-1]
def size(self):
return len(self.stack)
def is_empty(self):
return self.size() == 0