听到堆栈这个词,头脑可能会想到一堆书,我们就用这个类比来解释堆栈:
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)<=0:
return ("堆栈为空!")
return self.stack.pop()
#获取堆栈大小
def size(self):
return len(self.stack)
myStack = Stack()
print(myStack.push(5)) #打印 True
print(myStack.push(6)) #打印 True
print(myStack.push(9)) #打印 True
print(myStack.push(5)) #打印 False 因为5已经在栈中
print(myStack.push(3)) #打印 True
print(myStack.size()) #打印 4
print(myStack.pop()) #打印 3
print(myStack.pop()) #打印 9
print(myStack.pop()) #打印 6
print(myStack.pop()) #打印 5
print(myStack.size()) #打印 0
print(myStack.pop()) #打印堆栈为空
说明:
不必担心堆栈的大小,因为列表可以为我们呈现
使用数组实现堆栈
Python列表实现堆栈很容易。但如果想在语言未知的情况下实现,就要把列表假定为数组(大小固定),并使用栈顶指针来记录堆栈的状态。
算法
1.声明一个列表,及一个整形MaxSize表示堆栈大小
2.栈顶初始为0
3.入栈操作:
1)检查栈顶是否小于堆栈的MaxSize
a)如果是,向堆栈追加数据,并将栈顶增1
b)如果否,打印堆栈已满信息
4.出栈操作:
1)检测栈顶是否大于0:
a)如果是,从列表中移除最后一个元素,并将栈顶减1
b)如果否,打印堆栈为空信息
5.堆栈大小操作:
栈顶指针的值就是堆栈的大小
class Stack:
#构造器
def __init__(self):
self.stack = list()
self.maxSize = 8
self.top = 0
#向堆栈添加元素
def push(self,data):
if self.top>=self.maxSize:
return ("堆栈已满!")
self.stack.append(data)
self.top = 1
return True
#堆栈移除元素
def pop(self):
if self.top<=0:
return ("堆栈为空!")
item = self.stack.pop()
self.top -= 1
return item
#堆栈大小
def size(self):
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
除了上面实现的几个方法,还可以添加方法返回栈顶元素,检查堆栈是否为空
堆栈最常使用的场合就是在递归中,不妨写个程序验证以下,如将一句话颠倒过来。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved