什么是堆栈
听到堆栈这个词,头脑可能会想到一堆书,我们就用这个类比来解释堆栈:
1. 在堆栈的顶部有一本书(如果只有一本,那它就是最顶上那一本)
2. 只有拿走最顶部那本书,才可以去拿底下的书(假设一次只能取走一本书)
3. 当从顶部一本一本地拿走全部书时,这时没有剩下的书了,也就不能再拿了
有一个“汉诺塔”游戏,它完美地展示了堆栈是如何工作的。
下面以编程方式描述以上几点:
1 跟踪最顶端的元素,它可以告诉你堆栈中元素的个数,以及堆栈是满还是空(如果堆栈为空,则栈顶被设为0或一个负数)
2.最后一个进栈的元素总是第一个离开(后进先出)
3.如果移除了全部元素,则栈为空,如果尝试从一个空栈中移除元素,就会抛出警告或错误信息
4.如果堆栈达到了最大极限,仍要添加元素,也会抛出警告或错误信息
几个注意事项:
1.元素的入口与出口只能是堆栈的一端(顶部)
2.入栈(push)--把一个元素压入堆栈
3.出栈(pop)--从堆栈中移除一个元素
4.不允许随机访问--不能从中间添加或删除元素
注意:要一直跟踪栈顶,它可以告诉我们栈的状态
如何实现堆栈
使用列表实现堆栈
这里定义一个类:stack,并添加一个方法执行下面的操作:
1.将元素压入栈中
2.从堆栈中弹出元素,如果栈为空,则发出警告
3.获取栈的大小
4.打印堆栈的所有元素
python不需要像c或c++那样跟踪指针实现堆栈,它可以使用很容易地实现列表。
class stack:
#构造器创建一个列表
def __init__(self):
self.stack = list()
#向堆栈中添加元素
def push(self,data):
#进行检测,避免出现重复项
if data not in self.stack:
self.stack.append(data)
return true
return false
#从堆栈移除最后一个元素
def pop(self):
if len(self.stack)=self.maxsize:
return (堆栈已满!)
self.top += 1
#堆栈移除元素
if self.top<=0:
item = self.stack.pop()
self.top -= 1
return item
#堆栈大小
return self.top
s = stack()
print(s.push(1))#打印 true
print(s.push(2))#打印 true
print(s.push(3))#打印 true
print(s.push(4))#打印 true
print(s.push(5))#打印 true
print(s.push(6))#打印 true
print(s.push(7))#打印 true
print(s.push(8))#打印 true
print(s.push(9))#打印堆栈已满!
print(s.size())#打印 8
print(s.pop())#打印 8
print(s.pop())#打印 7
print(s.pop())#打印 6
print(s.pop())#打印 5
print(s.pop())#打印 4
print(s.pop())#打印 3
print(s.pop())#打印 2
print(s.pop())#打印 1
print(s.pop())#打印堆栈为空!
注意:元素9不会添加到堆栈中,因此栈的大小仍为8
除了上面实现的几个方法,还可以添加方法返回栈顶元素,检查堆栈是否为空
堆栈最常使用的场合就是在递归中,不妨写个程序验证以下,如将一句话颠倒过来。