算法系列15天速成 第八天 线性表【下】

算法系列15天速成 第八天 线性表【下】完整攻略

前言

在线性表【上】的基础上,我们再来讲一些新的线性表特性及其相关算法。

栈是一种特殊的线性表,只能在表尾插入和删除数据,简单来说就是类似于装东西的箱子。它有以下几个特点:

  1. 先进后出,后进先出,即最先入栈的元素最后出栈;
  2. 只能在表尾插入和删除数据,元素的加入和删除只发生在栈顶。

栈的应用

  1. 递归;
  2. 计算器;
  3. 括号匹配。

栈的实现方式

可以使用数组或链表实现。

栈的实现示例

这里我们使用链表来实现栈。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class Stack:
    def __init__(self):
        self.head = None

    def is_empty(self):
        return self.head == None

    def push(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

    def pop(self):
        if self.is_empty():
            return None
        temp = self.head
        self.head = self.head.next
        return temp.data

    def peek(self):
        if self.is_empty():
            return None
        return self.head.data

队列

队列也是一种线性表,它与栈不同的地方在于,队列只能在表尾插入数据,在表头删除数据。

队列的应用

  1. 操作系统中的任务调度;
  2. 模拟实验。

队列的实现方式

可以使用数组或链表实现。

队列的实现示例

这里我们使用链表来实现队列。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class Queue:
    def __init__(self):
        self.head = None
        self.tail = None

    def is_empty(self):
        return self.head == None

    def enqueue(self, data):
        new_node = Node(data)
        if self.tail == None:
            self.head = self.tail = new_node
            return
        self.tail.next = new_node
        self.tail = new_node

    def dequeue(self):
        if self.is_empty():
            return None
        temp = self.head
        self.head = temp.next
        if(self.head == None):
            self.tail = None
        return temp.data

    def peek(self):
        if self.is_empty():
            return None
        return self.head.data

双端队列

双端队列(deque,全称double-ended queue)是一种具有队列和栈的性质的数据结构。

双端队列的应用

经常用于解决某些问题时,数据需要「先进先出」(队列),但同时在某些操作时需要「后进先出」(栈)。

双端队列的实现方式

可以使用数组或链表实现。

双端队列的实现示例

这里我们使用双向链表来实现双端队列。

class Node:
    def __init__(self, data):
        self.data = data
        self.prev = None
        self.next = None

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

    def is_empty(self):
        return self.front == None

    def add_front(self, data):
        new_node = Node(data)
        if self.is_empty():
            self.front = self.rear = new_node
            return
        self.front.prev = new_node
        new_node.next = self.front
        self.front = new_node

    def add_rear(self, data):
        new_node = Node(data)
        if self.is_empty():
            self.front = self.rear = new_node
            return
        self.rear.next = new_node
        new_node.prev = self.rear
        self.rear = new_node

    def remove_front(self):
        if self.is_empty():
            return None
        temp = self.front
        self.front = temp.next
        if(self.front == None):
            self.rear = None
        else:
            self.front.prev = None
        return temp.data

    def remove_rear(self):
        if self.is_empty():
            return None
        temp = self.rear
        self.rear = temp.prev
        if(self.rear == None):
            self.front = None
        else:
            self.rear.next = None
        return temp.data

    def peek_front(self):
        if self.is_empty():
            return None
        return self.front.data

    def peek_rear(self):
        if self.is_empty():
            return None
        return self.rear.data

总结

以上就是关于栈、队列和双端队列的所有内容。希望你能够从这些算法中,深刻了解线性表的应用和实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:算法系列15天速成 第八天 线性表【下】 - Python技术站

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

相关文章

  • 浅析Java中Data类的应用

    浅析Java中Data类的应用 什么是Data类 Data类是Java中常用的日期操作类,用于处理日期和时间,并提供了对日期和时间的格式化,解析,计算以及转换等操作。 Data类位于java.util包中,可以通过import java.util.Data;来引入。 Data类的基本用法 创建Data对象 在Java中,我们可以通过多种方式创建Data对象。…

    Java 2023年5月20日
    00
  • Java数据类型转换详解

    Java数据类型转换详解 在Java编程中,我们需要对不同的数据类型进行转换,使其能够满足我们的需求。本文将详细讲解Java数据类型转换的相关知识。 基本数据类型 Java中的数据类型可以分为两类,基本数据类型和引用数据类型。基本数据类型包括整型、浮点型、字符型、布尔型,下面分别介绍。 整型 整型包括byte、short、int和long这四种类型。其中,b…

    Java 2023年5月26日
    00
  • 详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    Spring的两种代理方式 在使用Spring框架时,我们常常会使用到AOP(面向切面编程)的相关技术,而代理是AOP中必不可少的一个环节。在Spring中,支持两种代理方式:JDK动态代理和CGLIB动态代理。这两种代理方式都有各自的特点和优劣,具体使用哪种方式则要根据具体的情况而定。 JDK动态代理 JDK动态代理是基于接口的代理,它要求目标对象必须实现…

    Java 2023年5月20日
    00
  • 多模块maven的deploy集成gitlab ci自动发版配置

    下面是“多模块maven的deploy集成gitlab ci自动发版配置”的攻略: 1. 环境准备 首先,在进行操作前需要做好以下准备工作: 安装 Maven 确保所有子模块中的 pom.xml 文件都正确配置了 groupId、 artifactId、以及 version。 安装 gitlab-runner 并注册到 GitLab 项目中。 2. GitL…

    Java 2023年6月2日
    00
  • 超好用轻量级MVC分页控件JPager.Net

    JPager.Net是一款轻量级MVC分页控件,它可以帮助我们轻松地实现数据分页功能。以下是使用JPager.Net的攻略: 安装 JPager.Net可以通过NuGet安装。在Visual Studio中选择“工具”->“NuGet包管理器”->“程序包管理器控制台”,在控制台中输入以下命令进行安装: Install-Package JPage…

    Java 2023年5月19日
    00
  • java的Hibernate框架报错“TransactionException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“TransactionException”错误。这个错误通常是由于以下原因之一引起的: 数据库连接错误:如果您的数据库连接错误,则可能会出现此错误。在这种情况下,需要检查您的数据库连接配置以解决此问题。 事务管理器配置错误:如果您的事务管理器配置错误,则可能会出现此错误。在这种情况下,需要检查您的事务管理…

    Java 2023年5月4日
    00
  • JSP和JSTL获取服务器参数示例

    下面是关于“JSP和JSTL获取服务器参数示例”的完整攻略。 什么是JSP和JSTL? JSP(Java Server Pages)是一种动态网页技术,它使用Java编程语言和JSP标记语言来创建网页。JSTL(JSP Standard Tag Library)是一组JSP标记,它们可以让我们更轻松地在JSP页面中使用一些常见的功能,如循环、条件判断、格式化…

    Java 2023年6月15日
    00
  • 云服务器部署 Web 项目的实现步骤

    云服务器部署 Web 项目的实现步骤可分为以下几个步骤: 购买云服务器首先需要选择一个云服务器提供商,比如阿里云、腾讯云等,根据需求选择一款适合自己的云服务器型号和配置,并进行购买。 配置服务器环境在服务器上安装部署相关的环境和软件,如 Nginx、MySQL、PHP 等,以保证 Web 项目可以正常运行。可以通过 SSH 工具连接到服务器进行安装和配置。 …

    Java 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部