算法系列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面试题冲刺第二十七天–JVM2

    Java面试题冲刺第二十七天–JVM2 1. 内存模型 Java内存模型主要分为两种: 堆内存:存放我们new出来的对象以及数组等,这部分内存可以动态申请或释放。一般情况下,堆内存比较大。 栈内存:存放基本类型的变量以及对象的引用变量(指针),这些变量会随着程序的运行而申请或释放。栈的空间比较小,一般情况下,栈的大小是在程序启动的时候就固定下来。 2. J…

    Java 2023年5月19日
    00
  • 使用Netty实现类似Dubbo的远程接口调用的实现方法

    使用Netty框架,实现类似Dubbo的远程接口调用,可以按照以下步骤进行: 1. 定义接口API 首先,在服务提供方和服务消费方之间需要定义一个公共的API接口,即服务契约,包括方法名、参数列表和返回值等信息。 例如,定义一个简单的服务接口 HelloService : public interface HelloService { String sayH…

    Java 2023年5月20日
    00
  • springboot数据库操作图文教程

    下面是关于“springboot数据库操作图文教程”的完整攻略: 一、前言 在使用springboot进行web应用程序开发的过程中,我们通常需要对数据库进行操作。本文将阐述如何使用springboot框架进行数据库操作的方法。 二、选用支持的数据库 Spring Boot支持多种数据库,包括但不限于MySQL、PostgreSQL、Oracle等。在使用前…

    Java 2023年5月15日
    00
  • JavaWeb项目打开网页出现Session Error的异常解决方案

    让我来详细讲解一下“JavaWeb项目打开网页出现Session Error的异常解决方案”。 问题描述 JavaWeb项目打开网页出现Session Error的异常,错误信息如下: javax.servlet.ServletException: Invalid session id 这个错误的原因是由于SessionID失效或者Session被服务器删除…

    Java 2023年5月27日
    00
  • Spring Boot2.x集成JPA快速开发的示例代码

    Spring Boot2.x集成JPA快速开发的示例代码 在Spring Boot应用程序中,我们可以使用JPA(Java Persistence API)来快速开发数据库相关的应用程序。本文将详细讲解Spring Boot2.x集成JPA快速开发的完整攻略,并提供两个示例。 1. 添加JPA依赖 在pom.xml文件中添加以下依赖: <depende…

    Java 2023年5月15日
    00
  • Spring Boot Maven 打包可执行Jar文件的实现方法

    实现Spring Boot Maven打包成可执行Jar文件的实现方法,主要有两种。 1. 使用Spring Boot Maven插件打包 首先,需要在pom.xml文件中,引入Spring Boot Maven插件,具体如下: <build> … <plugins> … <plugin> <groupId&…

    Java 2023年5月20日
    00
  • 关于JavaScript作用域你想知道的一切

    关于JavaScript作用域你想知道的一切 什么是作用域? 在介绍作用域之前,我们先来看一下变量的定义。在JavaScript中,我们可以通过var、let或const三个关键字来声明变量。 var a = 1; // 使用var声明的变量 let b = 2; // 使用let声明的变量 const c = 3; // 使用const声明的变量 那么,作…

    Java 2023年6月16日
    00
  • JavaSpringBoot报错“IllegalStateException”的原因和处理方法

    原因 “IllegalStateException” 错误通常是以下原因引起的: 应用程序状态不正确:如果您的应用程序状态不正确,则可能会出现此错误。在这种情况下,您需要检查您的应用程序状态并确保它们正确。 应用程序配置不正确:如果您的应用程序配置不正确,则可能会出现此错误。在这种情况下,您需要检查您的应用程序配置并确保它们正确。 解决办法 以下是解决 “I…

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