使用列表结构但不是列表方法的Python堆栈模拟

时间:2014-03-30 23:06:26

标签: python list stack

如何在不使用列表方法的情况下模拟堆栈的推送和弹出功能?

到目前为止,我有类似的东西,但我不确定这是否有效:

stack = []

def Push(stack, element):
    stack[len(stack)] = element

def Pop(stack):
    element = tos
    stack[len(stack) - 1] = None

    return element;

推送工作,以这种方式动态添加到列表中,并且len适当更新吗?

对于pop,你会怎么做"删除"从堆栈中不使用任何列表函数?

3 个答案:

答案 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方法appendpop

实施例

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)可能是xs之上推送的结果。我建议您在寻求更多帮助之前尝试自己做这样的事情。

答案 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