Python实现栈,以及利用栈来实现文件的深度优先遍历、利用栈计算逆波兰式的值,实现有min方法的栈

博客介绍了用Python列表实现栈,阐述栈是特殊线性表,有后进先出特性。还介绍了栈类的定义,以及栈在文件深度遍历、计算逆波兰式结果、实现有min方法的栈等方面的应用,使用了Python自带的deque模块等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python实现的方法有很多种,这里就用列表来实现

栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。
栈的特性:后进先出或先进后出。

一、定义一个栈类(Python3实现)

class Inn:
    def __init__(self):
        self.__inn = []

    # 进栈
    def push(self, item):
        self.__inn.append(item)

    # 出栈
    def pop(self):
        return self.__inn.pop()

    # 栈顶元素
    def top(self):
        return self.__inn[-1]

    # 判断栈是否为空
    def isEmtpy(self):
        return len(self.__inn) == 0

    # 栈的大小
    def size(self):
        return len(self.__inn)

    # 清空栈
    def clear(self):
        self.__inn = []

二、栈的应用地方很多,比如我们最常见的电脑上的撤销操作,其原理就是用栈来实现的。
1.文件的深度遍历(windows)
这里使用的是Python自带的deque模块实现的栈。deque模块详解

import os
import os.path as opath
from collections import deque
def depth_path(path):
    # 把目录加入栈
    queue = deque()
    queue.append(path)
    while len(queue):  # 栈不为空
        # 栈顶元素出栈
        top = queue.pop()
        childDirs = os.listdir(top)
        for item in childDirs:
            tmp = opath.join(top, item)
            if opath.isdir(tmp):
                print("目录:", item)
                queue.append(tmp)
            else:
                print("文件:", item)


2.计算逆波兰式的计算结果,
形如这样的逆波兰式 (4, 13, 5, /, +)先将转为列表[“4”, “13”, “5”, “/”, “+”]
这里利用上面实现的栈类来计算

def calc(list):
    # 初始化一个栈
    inn = Inn()
    for i in list:
        # 判断是否符号,是则抛出两个栈顶元素
        if i in ('+', '-', '*', '/'):
            a = inn.pop()
            b = inn.pop()
            # a=5, b=13
            jss = b + i + a
            c = int(eval(jss))
            # 再将计算结果进栈
            inn.push(str(c))
        else:
            # 不是则压栈(进栈)
            inn.push(i)
    # 最后返回栈顶元素则计算结果
    return inn.pop()

3.实现一个有min方法的栈
这里我们使用两个栈来实现一个有min方法的栈

class inn_min:
    def __init__(self):
        # 初始化两个栈,一个用来存放数据,一个专门用来存放最小值
        self.__data_inn = Inn()
        self.__min_inn = Inn()
    
    # 进栈
    def push(self, item):
        # 数据栈,正常进栈
        self.__data_inn.push(item)
        # 最小值栈,判断是否是空栈或栈顶元素是否大于当前值
        if self.__min_inn.isEmtpy() or item < self.__min_inn.top():
            # 是则将当前的传入的数据进栈
            self.__min_inn.push(item)
        else:
            # 不是则将最小值栈的栈顶取出再压一次,和数据栈保持一致
            self.__min_inn.push(self.__min_inn.top())

    def pop(self):
        # 出栈则同时出
        self.__data_inn.pop()
        self.__min_inn.pop()

    def min_inn(self):
        # 求最小值时直接出最小值的栈顶即可
        return self.__min_inn.top()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值