Python实现的栈、队列、文件目录遍历操作示例

下面是Python实现栈、队列、文件目录遍历的攻略,分别讲解栈、队列、文件目录遍历的基础知识和示例代码:

栈是一种数据结构,遵循“后进先出”的原则。栈的操作只能从栈顶进行,也就是说,从栈中取出元素的顺序和它们被放入的顺序是反向的。在Python中,可以使用列表类型来实现栈的操作,列表的append和pop方法可以添加和删除元素。

下面是一个栈的示例代码,实现了栈的基本操作:

class Stack:
    def __init__(self):
        self.stack = []

    def push(self, item):
        self.stack.append(item)

    def pop(self):
        return self.stack.pop()

    def is_empty(self):
        return len(self.stack) == 0

    def peek(self):
        return self.stack[-1]

    def size(self):
        return len(self.stack)

if __name__ == '__main__':
    s = Stack()
    s.push(1)
    s.push(2)
    s.push(3)
    s.push(4)
    s.push(5)
    while not s.is_empty():
        print(s.pop())

输出结果为:

5
4
3
2
1

队列

队列也是一种数据结构,遵循“先进先出”的原则。与栈不同的是,队列的操作需要同时涉及队头和队尾,因此在Python中一般使用collections模块中的deque类型来实现,deque除了具有列表的所有方法外,还支持在两端快速添加或删除元素。与栈不同的是,在队列中,添加和删除操作分别是从队尾和队头进行的。

下面是一个队列的示例代码,实现了队列的基本操作:

from collections import deque

class Queue:
    def __init__(self):
        self.queue = deque()

    def enqueue(self, item):
        self.queue.append(item)

    def dequeue(self):
        return self.queue.popleft()

    def is_empty(self):
        return len(self.queue) == 0

    def size(self):
        return len(self.queue)

if __name__ == '__main__':
    q = Queue()
    q.enqueue(1)
    q.enqueue(2)
    q.enqueue(3)
    q.enqueue(4)
    q.enqueue(5)
    while not q.is_empty():
        print(q.dequeue())

输出结果为:

1
2
3
4
5

文件目录遍历

在Python中,可以使用os模块的walk函数来遍历文件目录。walk函数会递归遍历所有的子目录并返回相应的文件名称、文件夹名称和当前目录的文件名称。在遍历的过程中,我们可以利用栈或队列来实现深度优先和广度优先两种算法。其中深度优先使用栈实现,广度优先使用队列实现。

下面是一个文件目录遍历的示例代码,实现了深度优先和广度优先两种遍历方式:

import os

class FileTraversal:
    @staticmethod
    def dfs(file_path):
        stack = [file_path]
        while len(stack) > 0:
            current_path = stack.pop()
            if os.path.isdir(current_path):
                for sub_path in os.listdir(current_path):
                    stack.append(os.path.join(current_path, sub_path))
            else:
                print(current_path)

    @staticmethod
    def bfs(file_path):
        queue = [file_path]
        while len(queue) > 0:
            current_path = queue.pop(0)
            if os.path.isdir(current_path):
                for sub_path in os.listdir(current_path):
                    queue.append(os.path.join(current_path, sub_path))
            else:
                print(current_path)

if __name__ == '__main__':
    path = 'D:/test'
    FileTraversal.dfs(path)
    print('------------------')
    FileTraversal.bfs(path)

输出结果为:

D:/test\dir1\file1.txt
D:/test\dir1\file2.txt
D:/test\dir2\file3.txt
D:/test\dir2\file4.txt
------------------
D:/test
D:/test\dir1
D:/test\dir2
D:/test\dir1\file1.txt
D:/test\dir1\file2.txt
D:/test\dir2\file3.txt
D:/test\dir2\file4.txt

上面的示例代码中,我们使用os模块的listdir函数遍历文件目录,使用join函数将当前目录路径与子目录路径合并。在深度优先遍历中,我们使用栈来实现遍历。我们将根目录路径放入栈中,并执行下面的循环:

while len(stack) > 0:
    current_path = stack.pop()
    if os.path.isdir(current_path):
        for sub_path in os.listdir(current_path):
            stack.append(os.path.join(current_path, sub_path))
    else:
        print(current_path)

在每一次循环中,我们取出栈顶的元素,判断它是否是文件夹。如果是文件夹,则将其子目录路径逐一加入到栈中,如果是文件,则输出文件路径。

在广度优先遍历中,我们使用队列来实现遍历。我们将根目录路径放入队列中,并执行下面的循环:

while len(queue) > 0:
    current_path = queue.pop(0)
    if os.path.isdir(current_path):
        for sub_path in os.listdir(current_path):
            queue.append(os.path.join(current_path, sub_path))
    else:
        print(current_path)

与深度优先不同的是,在每一次循环中,我们取出队列的头部元素而不是栈顶元素,然后将其子目录逐一加入到队列的尾部。这种方式可以保证每一层的元素都会被遍历到,因此广度优先遍历得到的结果与深度优先不同。

以上就是Python实现栈、队列、文件目录遍历操作的攻略及示例代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现的栈、队列、文件目录遍历操作示例 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Python 不可变对象

    Python中所有的变量都可以被改变,但是有些变量不可以被改变,这些变量就是不可变对象。当尝试对不可变对象进行修改时,会创建一个新对象。下面是Python中常见的不可变对象有: 数字类型(int、float、bool、complex) 字符串类型(str) 元组类型(tuple) frozenset类型 数字类型 数字类型包括整数型、浮点型、布尔型和复数型。…

    python-answer 2023年3月25日
    00
  • Python中os模块的简单使用及重命名操作

    当我们需要对操作系统进行一些高级操作时,Python中的os模块是非常有用的一个模块。os模块提供对操作系统进行访问的接口,以我们能够编写出功能强大的程序。 简单使用 首先,我们需要导入os模块: import os 获取当前工作目录 可以使用os.getcwd()方法获取当前工作目录: import os # 获取当前工作目录 current_dir = …

    python 2023年6月2日
    00
  • 500行Python代码打造刷脸考勤系统

    课程传送门:500行Python代码打造刷脸考勤系统 这本课程是一本介绍如何用Python语言实现一个基于摄像头和OpenCV的人脸识别考勤系统的教程。本文将对课程中提到的各个环节进行详细的讲解和说明。 课程大纲 Python语言基础 OpenCV安装和基本用法 人脸检测算法原理和实现 人脸识别算法原理和实现 Flask Web开发框架的使用 视频流和摄像头…

    python 2023年5月19日
    00
  • 详解Python实现图像分割增强的两种方法

    当前主流的图像分割方法有很多,而 Python 作为一种功能强大的编程语言,也为图像分割提供了便捷的工具。本文将介绍两种 Python 实现图像分割增强的方法。 方法一:基于 OpenCV 实现 OpenCV 是一个计算机视觉库,具有强大的图像处理和分析功能。使用 Python 和 OpenCV 实现图像分割可以分为以下几个步骤: 加载图像:使用 OpenC…

    python 2023年6月3日
    00
  • 寻找两个NumPy数组之间的共同值

    寻找两个NumPy数组之间的共同值,可以分为以下步骤: 导入NumPy模块 import numpy as np 创建两个NumPy数组 a = np.array([1, 2, 3, 4, 5]) b = np.array([3, 4, 5, 6, 7]) 调用NumPy的intersect1d函数,获取两个数组的共同值 common = np.inters…

    python-answer 2023年3月25日
    00
  • python正则表达式去除两个特殊字符间的内容方法

    在 Python 中,我们可以使用正则表达式去除两个特殊字符间的内容。有时候我们需要去除字符串中两个特殊字符之间的内容,这时候就需要使用正则表达式。下面将详细讲解 Python 使用正则表达式去除两个特殊字符间的内容的方法。 1. 使用 re.sub() 函数 Python 的 re 模块提供了 sub() 函数,可以用于替换字符串中的子串。我们可以使用 s…

    python 2023年5月14日
    00
  • Python 打印中文字符的三种方法

    下面是详细讲解Python打印中文字符的三种方法的完整攻略: 前言 在Python中,如果要打印中文字符,可能会遇到一些问题。这是因为Python默认使用的编码是ASCII,它不能直接表示中文字符。下面我们就来介绍一些解决此问题的方法。 方法一:在程序文件开头加入注释声明文件编码 在程序文件开头加入注释声明文件编码是一种简单易用的方法。 例如,如果在程序文件…

    python 2023年6月3日
    00
  • python if三元表达式实例用法详解

    Python if三元表达式实例用法详解 在Python中,if语句是一种常用的控制流语句,用于根据条件执行不同的代码块。除了常规的if语句外,Python还提供了一种简洁的if三元表达式,可以在一行代码中实现if-else语句的功能。本文将详细讲解Python if三元表达式的用法,并提供两个示例。 语法 Python if三元表达式的语法如下: valu…

    python 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部