如何在不使用列表方法的情况下模拟堆栈的推送和弹出功能?
到目前为止,我有类似的东西,但我不确定这是否有效:
stack = []
def Push(stack, element):
stack[len(stack)] = element
def Pop(stack):
element = tos
stack[len(stack) - 1] = None
return element;
推送工作,以这种方式动态添加到列表中,并且len适当更新吗?
对于pop,你会怎么做"删除"从堆栈中不使用任何列表函数?
答案 0 :(得分:1)
您可以使用类似的内容(警告:这是一个天真的实现 - 它不会对传递的参数执行检查):
class Stack(object):
def __init__(self):
self._stack = [] # Allocate an empty list
def push(self, ele):
self._stack += [ele] # Use list concatenation to emulate the `push` operation
def pop(self):
last = self._stack[-1:] # Return the last element of the list (also works for empty lists)
self._stack = self.stack[0:-1] # Copy the elements from the beginning of the list to the last element of the list
return last # return the last element
# All stacks should have the `size` function to determine how many elements are
# in the stack:
def size(self):
return len(self._stack)
# Occasionally you'll want to see the contents of the stack, so we have to
# implement the `__str__` magic method:
def __str__(self):
return '[%s]' % ','.join(map(str, self._stack))
注意:此方法不使用任何list
方法append
和pop
。
实施例
s = Stack()
# fill the stack with values:
for i in xrange(10):
s.push(i+1)
print s # Outputs: [1,2,3,4,5,6,7,8,9,10]
s.pop()
s.pop()
print s # Outputs: [1,2,3,4,5,6,7,8]
答案 1 :(得分:0)
我认为本练习的目的是将堆栈视为abstract data type。您可以在不使用列表的情况下实现它们。如果你坚持使用列表,我不确定你的意思是“不使用列表方法”。
堆栈(作为列表)是具有两个构造函数的数据类型:(a)空堆栈,以及(b)将元素推入堆栈的结果。你可以在Python中提出这两个不同的实现。例如,None
可能是空堆栈,(x, s)
可能是x
在s
之上推送的结果。我建议您在寻求更多帮助之前尝试自己做这样的事情。
答案 2 :(得分:0)
您可以预先分配一个列表:
class Stack:
def __init__(self, max_items):
self.data = [0] * max_items
self.max_items = max_items
self.top = -1
def push(self, i):
self.top += 1
if self.top < self.max_items:
self.data[self.top] = i
else:
self.top -= 1
raise ValueError("stack is full")
def pop(self):
if self.top >= 0:
i = self.data[self.top]
self.top -= 1
return i
else:
raise ValueError("stack is empty")
def __len__(self):
return self.top + 1