赞
踩
@ 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。