当前位置:   article > 正文

python-栈-案例_應用python栈之實際案例

應用python栈之實際案例

@ 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())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

执行结果:
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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

执行结果:
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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/536783
推荐阅读
相关标签
  

闽ICP备14008679号