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())

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python手势识别项目案例通常涉及到计算机视觉(CV)和机器学习技术,其中一种流行的方法是使用深度学习库如OpenCV、TensorFlow或Keras,配合深度神经网络(DNN)进行实时手势识别。以下是一个简单的Python手势识别项目案例概述: 1. **项目背景**:例如,你可以创建一个手势控制系统,用于控制电子设备(如智能家居设备)或者在游戏中的交互。 2. **技术**: - Python:作为主要编程语言,用于数据处理、模型训练和部署。 - OpenCV:用于图像预处理、特征提取(如HSV色彩空间或Haar特征)。 - TensorFlow / Keras:深度学习框架,用于构建卷积神经网络(CNN)模型进行手势识别。 - 数据集:如Gestures++或Oxford Hand gesture dataset,用于训练模型。 3. **项目流程**: - 数据采集:记录用户的手势样本并标记。 - 数据预处理:将图像转换为模型所需的输入格式(如灰度图、归一化等)。 - 模型训练:使用训练数据训练CNN模型,可能包括数据增强来提高泛化能力。 - 模型验证与优化:通过交叉验证评估模型性能,并调整超参数。 - 实时识别:在摄像头捕获的视频流中应用模型进行实时手势识别。 4. **相关问题--:** 1. 如何选择合适的深度学习架构来识别手势? 2. 在项目中如何解决手势识别的噪声干扰问题? 3. 如何提高模型在新手势的识别率? 这个项目案例仅供参考,实际实现会根据具体需求和技术细节有所不同。如果你对这个话题感兴趣,建议你搜索相关教程或博客,以便深入了解和动手实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值