@ Time : 2020/10/17 17:52
@ Author : Ellen
如何理解“栈”?
后进先出,先进后出,就是典型的“栈”结构
栈是一种操作受限的线性表,只允许在一端插入和删除。为何不直接使用数组或链表,为什么还要用这个“操作受限”的“栈”?
从功能上说,链表确实可以替代栈,但要知道,特定的数据结构是对特定场景的抽象,而且,数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,自然也就更容易出错。
当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出,先进后出的特性,就可以首选“栈”这种数据结构。
如何实现一个“栈”?
栈主要包含两个操作,进栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据。
实际上,栈既可以用顺序表来实现,也可以用链表来实现。用顺序表实现的栈叫顺序栈,用链表实现的栈,叫链式栈。
栈的操作
Stack() 创建一个新的空栈
Push(item) 添加一个新的元素item到栈顶
pop()弹出栈顶元素
peek()返回栈顶元素
is_empty()判断栈是否为空
size()返回栈的元素个数
“”"
Stack() 创建一个新的空栈
push(liem) 添加一个新的元素item到栈顶
pop() 弹出栈顶元素
peek() 返回栈顶元素
is_empty() 判断栈是否为空
size() 返回栈的元素个数
“”"
class Stack():
"""创建一个空栈"""
def __init__(self):
self.__items = []
def push(self, item):
"""添加元素"""
self.__items.append(item)
# self.__items.insert(0, item)
def pop(self):
"""弹出元素"""
return self.__items.pop()
def peek(self):
"""返回栈顶元素"""
if self.__items and len(self.__items) >= 1:
# self.__items[-1] 是空列表 报错
return self.__items[len(self.__items)-1]
else:
return None
def is_empty(self):
""""判断是否为空"""
if self.__items == []:
return True
else:
return False
def size(self):
"""返回栈的大小"""
return len(self.__items)
if __name__ == '__main__':
s =Stack()
s.push(1)
s.push(2)
s.pop()
print(s.is_empty())
print(s.size())
执行结果:
False
1
案例
浏览器的前进、后退功能,我们都很熟悉吧?
当你依次访问完一串页面a-b-c之后,点击浏览器的后退按钮,就可以查看到之前浏览过的页面b和a,当你后退到页面a,点击前进按钮,就可以重新查看页面b和c,但是,如果你后退到页面b,点击了新的页面d,那就无法再通过前进、后退功能查看页面c了。
假设你是Chrome浏览器的开发工程师,你会如何实现这个功能?
from stack_demo import Stack
class ChormeBrow():
def __init__(self):
self.x = Stack()
self.y = Stack()
def open(self, url):
print("open new url %s" % url)
self.x.push(url)
def can_forward(self):
if self.y.is_empty():
return False
return True
def forward(self):
url = self.y.pop()
self.x.push(url)
print("forward to %s url" % url)
def can_back(self):
if self.x.is_empty():
return False
return True
def back(self):
url = self.x.pop()
self.y.push(url)
print("back to %s url" % self.x.peek())
def can_back(self):
if self.x.is_empty():
return False
return True
if __name__ == '__main__':
cb = ChormeBrow()
cb.open('www.baidu.com')
cb.open('www.python.com')
cb.open('www.python1.com')
if cb.can_back():
cb.back()
if cb.can_forward():
cb.forward()
cb.back()
cb.forward()
执行结果:
open new url www.baidu.com
open new url www.python.com
open new url www.python1.com
back to www.python.com url
forward to www.python1.com url
back to www.python.com url
forward to www.python1.com url