数据结构--栈和队列

个人介绍

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述
🦁作者简介:一名喜欢分享和记录学习的在校大学生
💥个人主页code袁
💥 个人QQ:2647996100
🐯 个人wechat:code8896

专栏导航

code袁系列专栏导航
1.毕业设计与课程设计:本专栏分享一些毕业设计的源码以及项目成果。🥰🥰🥰
2.微信小程序开发:本专栏从基础到入门的一系开发流程,并且分享了自己在开发中遇到的一系列问题。🤹🤹🤹
3.vue开发系列全程线路:本专栏分享自己的vue的学习历程。

非常期待和您一起在这个小小的互联网世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨ 

在这里插入图片描述

在这里插入图片描述

1、 什么是栈?

栈是一种线性数据结构,具有后进先出(LIFO)的特点。栈可以简单地理解为一摞盘子,我们只能在盘子的顶部放入或取出盘子,不能在中间插入或者从底部取出盘子。

栈的基本操作

栈的基本操作包括压入(push)和弹出(pop)两种操作:

  • 压入(push):将元素放入栈顶。
  • 弹出(pop):从栈顶取出元素。

除了基本操作,栈还有其他常用的操作,比如查看栈顶元素(top)、判断栈是否为空(isEmpty)等。

栈的实现

栈可以使用数组或链表来实现。下面是一个使用数组实现栈的示例代码:

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

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

    def pop(self):
        if not self.isEmpty():
            return self.stack.pop()
        else:
            return None

    def top(self):
        if not self.isEmpty():
            return self.stack[-1]
        else:
            return None

    def isEmpty(self):
        return len(self.stack) == 0
栈的应用

栈在计算机科学中有着广泛的应用,比如:

  • 函数调用:函数调用时使用栈来保存函数的局部变量和返回地址。
  • 表达式求值:中缀表达式转换为后缀表达式时常用栈来实现。
  • 浏览器的返回按钮:浏览器的返回按钮使用栈来记录访问过的页面。
栈的例子

1. 使用栈判断括号是否匹配

def is_valid_parentheses(s):
    stack = []
    mapping = {')': '(', '}': '{', ']': '['}
    
    for char in s:
        if char in mapping.values():
            stack.append(char)
        elif char in mapping.keys():
            if not stack or mapping[char] != stack.pop():
                return False
    
    return not stack

2. 使用栈实现逆波兰表达式求值

def evalRPN(tokens):
    stack = []
    operators = {'+', '-', '*', '/'}
    
    for token in tokens:
        if token not in operators:
            stack.append(int(token))
        else:
            b = stack.pop()
            a = stack.pop()
            if token == '+':
                stack.append(a + b)
            elif token == '-':
                stack.append(a - b)
            elif token == '*':
                stack.append(a * b)
            elif token == '/':
                stack.append(int(a / b))
    
    return stack[0]

2、 什么是队列?

队列是一种线性数据结构,具有先进先出(FIFO)的特点。队列可以简单地理解为排队,先到先得,后到后得。

队列的基本操作

队列的基本操作包括入队(enqueue)和出队(dequeue)两种操作:

  • 入队(enqueue):将元素放入队列的末尾。
  • 出队(dequeue):从队列的头部取出元素。

除了基本操作,队列还有其他常用的操作,比如查看队列头部元素(front)、查看队列尾部元素(rear)、判断队列是否为空(isEmpty)等。

队列的实现

队列可以使用数组或链表来实现。下面是一个使用链表实现队列的示例代码:

class QueueNode:
    def __init__(self, value):
        self.value = value
        self.next = None

class Queue:
    def __init__(self):
        self.front = None
        self.rear = None

    def enqueue(self, item):
        new_node = QueueNode(item)
        if self.isEmpty():
            self.front = new_node
            self.rear = new_node
        else:
            self.rear.next = new_node
            self.rear = new_node

    def dequeue(self):
        if not self.isEmpty():
            item = self.front.value
            self.front = self.front.next
            if self.front is None:
                self.rear = None
            return item
        else:
            return None

    def front(self):
        if not self.isEmpty():
            return self.front.value
        else:
            return None

    def rear(self):
        if not self.isEmpty():
            return self.rear.value
        else:
            return None

    def isEmpty(self):
        return self.front is None

队列的应用

队列在计算机科学中有着广泛的应用,比如:

  • 任务调度:操作系统中的任务调度通常使用队列来实现。
  • 广度优先搜索:图的广度优先搜索算法中使用队列来保存待访问的节点。
  • 消息队列:在分布式系统中,消息队列常用来实现异步通信。

队列的例子

1. 使用队列实现烫手山芋游戏

from collections import deque

def hot_potato(names, num):
    queue = deque(names)
    while len(queue) > 1:
        for _ in range(num):
            queue.append(queue.popleft())
        queue.popleft()
    return queue.pop()

2. 使用队列实现广度优先搜索

def bfs(graph, start):
    visited = set()
    queue = Queue()
    queue.enqueue(start)
    visited.add(start)
    while not queue.isEmpty():
        node = queue.dequeue()
        print(node)
        for neighbor in graph[node]:
            if neighbor not in visited:
                queue.enqueue(neighbor)
                visited.add(neighbor)

🎉写在最后

🍻伙伴们,如果你已经看到了这里,觉得这篇文章有帮助到你的话不妨点赞👍或 Star ✨支持一下哦!手动码字,如有错误,欢迎在评论区指正💬~

你的支持就是我更新的最大动力💪~
在这里插入图片描述

相关推荐

  1. 数据结构---队列

    2024-06-08 18:22:03       60 阅读
  2. 数据结构:队列

    2024-06-08 18:22:03       58 阅读
  3. 数据结构队列

    2024-06-08 18:22:03       40 阅读
  4. 数据结构队列

    2024-06-08 18:22:03       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 18:22:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 18:22:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 18:22:03       87 阅读
  4. Python语言-面向对象

    2024-06-08 18:22:03       96 阅读

热门阅读

  1. CTF简单介绍

    2024-06-08 18:22:03       35 阅读
  2. Chrome 扩展 background 与content_script 之间通信

    2024-06-08 18:22:03       39 阅读
  3. 强化学习面试题

    2024-06-08 18:22:03       36 阅读
  4. 嵌入式C语言面试题笔试题

    2024-06-08 18:22:03       33 阅读
  5. kubesphere报错

    2024-06-08 18:22:03       43 阅读
  6. 物联网的应用——工业自动化

    2024-06-08 18:22:03       30 阅读
  7. 前端判断数据类型的方法有哪些?

    2024-06-08 18:22:03       29 阅读
  8. html+css示例

    2024-06-08 18:22:03       34 阅读
  9. spring入门aop和ioc

    2024-06-08 18:22:03       21 阅读
  10. Golang:go-redis支持Redis Server和Redis Cluster的客户端

    2024-06-08 18:22:03       35 阅读