Task 2 – 栈
- 很多数据结构的知识都已经遗忘的差不多,借此次学习来一一回顾,我们经常说到堆栈,队列,链表等等,在这里说明一个我很容易犯的错,在数据结构里,堆和栈是两种不同的数据结构,对于堆个人理解更像一个有序的完全二叉树,而栈是一种FILO的数据结构,但是值得我们注意的是,堆栈如果连在一起他其实就是栈,只不过名称不同而已,因此很多人在博客里面更多的利用堆栈来指明栈,这也就会让很多学习者看的很懵(我就是一个)
- 过多的只是我就不说明,因为在之前看见过一篇博客,写的十分详细稍后将连接贴出来,感兴趣的大家可以去了解下
- 参考链接: https://www.cnblogs.com/guoxiaoyan/articles/8664150.html
- 在接下来我会用python实现一系列的数据结构,并不断完善封装,以供直接继承和调用,因为在很多人看来python其实并没有底层c语言之类的更容易理解数据结构,在这里我觉得并不然,正是因为python都已经封装的很完善,我们才更需要去查看源码,了解底层原理,既可以提高自己的编码能力,还能加深理解,对于想自己设计以及自己开发一套新的东西出来很有帮助!
- 下面的只是最初版,在我个人理解上实现的最原始功能,后续会不断完善,也欢迎各位大佬前来指正和交流
源码
from Task1.OwnLinklist import LinkList
class StackByArray:
def __init__(self):
self.stack = list()
def insert(self, value):
self.stack.append(value)
def pop(self):
try:
self.stack.pop(-1)
except IndexError:
raise IndexError("Stack is empty")
class StackByLinklist:
def __init__(self):
"""
由于上一任务中链表存在逻辑问题,此处新建时需要传入参数
"""
self.stack = LinkList(['header'])
def insert(self, value):
self.stack.append(value)
def pop(self):
length = self.stack.length()
if length <= 1:
raise IndexError("Stack is empty")
else:
self.stack.delete(length - 1)
if __name__ == '__main__':
stack_web = StackByArray()
while True:
key_event = input("Choose:")
if key_event == 'forward':
data = 'url:forward'
stack_web.insert(data)
else:
try:
data = stack_web.pop()
except IndexError:
raise IndexError("Not enough page")