《算法导论》学习笔记之Chapter10---队列的数组实现

2024-05-16 00:18

本文主要是介绍《算法导论》学习笔记之Chapter10---队列的数组实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

紧接上一篇文章,本文记录数组实现队列的实现

队列的定义:顺序存储结构存储的队列称为顺序队列,是一个内部存储元素按顺序排列的列表,遵循先进先出原则。

需要理解的是队列的两个定义:队头front和队尾rear。两者都是指向队列元素的指针,队头指针始终指向队列最先进去的元素的前一个下标位置,初始值可设为-1。队尾指向队列最后进去的元素下标,初始值常为0。

    判断队列是否为空的条件是:队头指针是否等于队尾指针,即:rear == front

    判断队列是否已满的条件是:队尾指针是否等于队列容量,即:rear == capacity(下面的程序中rear == a.length - 1是因为下标从0开始,其实是一个意思)


public class Queue {public static void main(String[] args) {ArrayQueue queue = new ArrayQueue(10);System.out.println(queue.isEmpty());System.out.println(queue.peekFront());for (int i = 0; i < 10; i++) {queue.insert(i);}System.out.println(queue.isFull());while (!queue.isEmpty()) {System.out.println(queue.remove());}}}class ArrayQueue {private int[] a;// 内置数组private int front;// 头指针-队头指针指向队列头结点的前一个位置private int rear;// 尾指针-队尾指针指向队列尾节点位置public ArrayQueue(int size) {this.a = new int[size];front = -1;rear = -1;}/*** 判断队列是否为空** @return*/public boolean isEmpty() {return front == rear;}/*** 判断队列是否已满** @return*/public boolean isFull() {return a.length - 1 == rear;}/*** 向队列的队尾插入一个元素*/public void insert(int item) {if (isFull()) {throw new RuntimeException("队列已满");}a[++rear] = item;}/*** 获得对头元素** @return*/public int peekFront() {return a[front + 1];}/*** 获得队尾元素** @return*/public int peekRear() {return a[rear];}/*** 从队列的对头移除一个元素** @return*/public int remove() {if (isEmpty()) {throw new RuntimeException("队列为空");}return a[++front];}
}

队列与栈的关系:

队列与栈关系还是较为近的,队列可以实现栈功能,栈也可以实现队列功能。

两个队列实现栈的代码:

class StackOfQueue {Queue<Integer> queue1 = new ArrayDeque<>();Queue<Integer> queue2 = new ArrayDeque<>();public boolean push(int node) {// 两个栈都为空时,优先考虑queue1if (queue1.isEmpty() && queue2.isEmpty()) {queue1.add(node);return true;}// 如果queue1为空,queue2有元素,直接放入queue2if (queue1.isEmpty()) {queue2.add(node);return true;}if (queue2.isEmpty()) {queue1.add(node);return true;}return false;}public int pop() {// 两个栈都为空时,没有元素可以弹出if (queue1.isEmpty() && queue2.isEmpty()) {try {throw new Exception("stack is empty");} catch (Exception e) {}}// 如果queue1为空,queue2有元素, 将queue2的元素依次放入queue1中,直到最后一个元素,我们弹出。if (queue1.isEmpty()) {while (queue2.size() > 1) {queue1.add(queue2.poll());}return queue2.poll();}if (queue2.isEmpty()) {while (queue1.size() > 1) {queue2.add(queue1.poll());}return queue1.poll();}return (Integer) null;}}

两个栈实现队列功能的代码:

class QueueOfStack {Stack<Integer> stack1 = new Stack<Integer>();Stack<Integer> stack2 = new Stack<Integer>();public boolean push(int node) {// 两个栈都为空时,优先考虑queue1if (stack1.isEmpty() && stack2.isEmpty()) {stack1.push(node);return true;}// 如果queue1为空,queue2有元素,直接放入queue2if (stack1.isEmpty()) {stack2.push(node);return true;}if (stack2.isEmpty()) {stack1.push(node);return true;}return false;}public int pop() {// 两个栈都为空时,没有元素可以弹出if (stack1.isEmpty() && stack2.isEmpty()) {try {throw new Exception("queue is empty");} catch (Exception e) {}}// 如果stack1为空,stack2有元素, 将stack2的元素依次放入stack1中,直到最后一个元素,我们弹出。if (stack1.isEmpty()) {while (stack2.size() > 1) {stack1.add(stack2.pop());}return stack2.pop();}if (stack2.isEmpty()) {while (stack1.size() > 1) {stack2.add(stack1.pop());}return stack1.pop();}return (Integer) null;}
}

注释写的还算清楚,以后应该也能轻易看懂。


关于java中队列的使用这里有一篇不错的文章,可以参考一下:http://blog.csdn.net/lzy_lizhiyang/article/details/48311925









这篇关于《算法导论》学习笔记之Chapter10---队列的数组实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993332

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur