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

yizhihongxing

算法系列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日

相关文章

  • SpringBoot整合Spring Data JPA的详细方法

    针对这个话题,下面是SpringBoot整合Spring Data JPA的详细方法的攻略: 1. 添加依赖 在 pom.xml 文件中添加如下依赖: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <arti…

    Java 2023年5月19日
    00
  • Java struts2请求源码分析案例详解

    Java struts2请求源码分析攻略 概述 在Java web开发中,struts2框架是一个常用的web应用框架。为了深入了解struts2框架的使用和工作原理,我们需要对其请求源码进行分析。 步骤 步骤1:打开struts2源码 首先,我们需要下载struts2框架的源代码,并导入到开发工具中。源代码可以在struts2官网或者GitHub上下载。 …

    Java 2023年5月20日
    00
  • Spring cloud alibaba之Ribbon负载均衡实现方案

    Spring Cloud Alibaba之Ribbon负载均衡实现方案 什么是负载均衡 在计算机网络中,负载均衡是指将任务或服务请求分摊给多个处理单元,例如计算机、网络、磁盘、存储设备,以达到最大的吞吐量,最小化响应时间,最大化可靠性,以及避免单点故障的目的。 为什么使用负载均衡 当一个系统需要处理大量的请求时,单个服务实例难以承受这样的压力。通过使用负载均…

    Java 2023年5月19日
    00
  • java的jdk基础知识点总结

    Java JDK基础知识点总结 Java JDK是Java开发的核心工具包,包含了许多开发和运行Java程序所需要的基本组件。以下是Java JDK的一些基础知识点总结。 JDK、JRE和JVM之间的关系 JDK(Java Development Kit)是开发Java应用程序所需要的工具包,它包含了完整的JRE和一些开发工具,如编译器和调试器。 JRE(J…

    Java 2023年5月20日
    00
  • java字符串与格式化输出的深入分析

    Java字符串与格式化输出的深入分析 Java是一种面向对象、操作简便、具备强大功能的编程语言。字符串在Java中有着十分重要的地位。本攻略将深入分析Java中字符串和格式化输出的特性和用法。 Java字符串 什么是字符串 字符串是指一串由字符组成的数据类型。Java中的字符串类型是String。字符串对象一旦创建就不能再被修改,因此称它是不可变的。 字符串…

    Java 2023年5月26日
    00
  • java实现手写一个简单版的线程池

    下面是Java实现手写一个简单版的线程池的完整攻略。 什么是线程池? 线程池是管理线程的一种机制,它可以为任务分配线程、重复利用已创建的线程、控制并发线程数量,从而提高程序的性能和稳定性。 线程池的原理 线程池由一个线程池管理器(ThreadPoolExecutor)和若干个工作线程(Thread)组成。线程池管理器负责线程池的初始化、关闭、提交任务、监控线…

    Java 2023年5月18日
    00
  • MyBatis入门程序

    下面我就来详细讲解一下MyBatis入门程序的完整攻略。 1. 环境搭建 首先,我们需要在本地搭建好MyBatis的开发环境。具体步骤如下: 下载MyBatis的最新版本。 创建一个Maven项目,将下载好的MyBatis加入到项目的依赖中。 在项目中创建一个名为“mybatis-config.xml”的文件,用来配置MyBatis的核心设置,例如数据库连接…

    Java 2023年5月20日
    00
  • 老生常谈计算机中的编码问题(必看篇)

    老生常谈计算机中的编码问题(必看篇) 简介 计算机中的编码问题是计算机领域长期存在的老生常谈问题之一。这个问题的本质是计算机内部和外部传输的信息都需要以某种编码方式呈现,而不同的编码方式之间可能存在互相转换的问题,容易引起信息传输和解读上的困难。 常见编码方式 常见的计算机编码方式包括ASCII编码、Unicode编码和UTF-8编码等。其中: ASCII编…

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