李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
Scala队列练习
Leefs
2021-04-23 AM
1513℃
0条
# Scala队列练习 ### 一、概念介绍 基于队列概念介绍可参考文章:[数据结构学习--队列(一)](https://lilinchao.com/archives/471.html) 基于环形队列概念介绍可参考文章:[数据结构学习--环形队列(二)](https://lilinchao.com/archives/473.html) 本文将不在进行过多赘述 ### 二、代码 **2.1 数组模拟单向队列** **object** ```scala import scala.io.StdIn object ArrayQueueDemo01 { def main(args: Array[String]): Unit = { //初始化一个队列 val queue = new ArrayQueue(3) var key = "" while (true) { println("show:表示显示队列") println("exit:表示退出队列") println("add:表示添加数据到队列") println("get:表示取出队列的数据") println("head: 查看队列头的数据(不改变队列)") key = StdIn.readLine() key match { case "show" => queue.showQueue() case "exit" => System.exit(0) case "add" => { println("请输入一个数据(Int类型):") val n = StdIn.readInt() queue.addQueue(n) } case "get" => { val res = queue.getQueue() if (res.isInstanceOf[Exception]) { println(res.asInstanceOf[Exception].getMessage) } else { println(s"取出对列的数据是 $res") } } case "head" => { val res = queue.headQueue() if (res.isInstanceOf[Exception]) { // 显示错误信息 println(res.asInstanceOf[Exception].getMessage) } else { println("队列头元素的值为=" + res) } } case default => println("输入格式错误,请重新输入!") } } } } ``` **class** ```scala class ArrayQueue(arrMaxSize:Int) { //该队列的最大容量 val maxSize = arrMaxSize //该数组存放数据,模拟队列 val arr = new Array[Int](maxSize) //记录队列前端 var front = -1 // front 是队列最前元素的索引[不含] // 记录队列后端 var rear = -1 // rear 是队列最后元素的索引[含] //判断队列是否已满 def isFull():Boolean = { rear == maxSize - 1 } //判断队列是否为空 def isEmpty(): Boolean = { rear == front } //添加数据到队列 def addQueue(n:Int):Unit = { //添加数据到队列之前,先判断队列是否已满 if(isFull()){ println("队列已满,无法添加数据......") return } rear += 1 arr(rear) = n } //获取对列数据 def getQueue():Any = { // 获取队列数据之前,先判断队列是否为空 if(isEmpty()){ return new Exception("队列为空,无法获取对列数据") } front += 1 return arr(front) } //显示队列的所有数据 def showQueue():Unit = { //显示队列数据之前,先判断队列是否为空 if(isEmpty()){ println("队列为空,没有数据可显示...") return } //遍历队列数据 for(i <- front + 1 to rear){ printf("arr[%d]=%d\n", i, arr(i)) } } // 查看队列的头元素,不是改变队列 def headQueue(): Any = { if (isEmpty()) { return new Exception("队列为空,没有头元素可查看") } // 这里注意,不要去改变 fornt 值 return arr(front + 1) } } ``` **2.2 数组模拟环形队列** **object** ```scala import scala.io.StdIn object ArrayQueueDemo02 { def main(args: Array[String]): Unit = { // 初始化一个队列 val queue = new ArrayCircularQueue(4) var key = "" while (true) { println("show:表示显示队列") println("exit:表示退出队列") println("add:表示添加数据到队列") println("get:表示取出队列的数据") println("head: 查看队列头的数据(不改变队列)") key = StdIn.readLine() key match { case "show" => queue.showQueue() case "exit" => System.exit(0) case "add" => { println("请输入一个数据(Int类型):") val n = StdIn.readInt() queue.addQueue(n) } case "get" => { val res = queue.getQueue() if (res.isInstanceOf[Exception]) { println(res.asInstanceOf[Exception].getMessage) } else { println(s"取出对列的数据是 $res") } } case "head" => { val res = queue.headQueue() if(res.isInstanceOf[Exception]) { // 显示错误信息 println(res.asInstanceOf[Exception].getMessage) }else { println("队列头元素的值为=" + res) } } case default => println("输入格式错误,请重新输入!") } } } } ``` **class** ```scala class ArrayCircularQueue(arrMaxSize: Int) { // 该队列的最大容量 val maxSize = arrMaxSize // 该数组存放数据,模拟队列 val arr = new Array[Int](maxSize) // 记录队列前端 var front = 0 // front 是队列最前元素的索引[含] // 记录队列后端 var rear = 0 // rear 是队列最后元素的索引[含] // 判断队列是否已满 def isFull(): Boolean = { // 尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的时候需要注意 (rear + 1) % maxSize == front } // 判断队列是否为空 def isEmpty(): Boolean = { rear == front } // 添加数据到队列 def addQueue(n: Int): Unit = { // 添加数据到队列之前,先判断队列是否已满 if (isFull()) { println("队列已满,无法添加数据...") return } arr(rear) = n rear = (rear + 1) % maxSize // 将 rear 通过取模的方式后移,注意与 rear = rear + 1 的区别 } // 获取对列数据 def getQueue(): Any = { // 获取队列数据之前,先判断队列是否为空 if (isEmpty()) { return new Exception("对列为空,无法获取对列数据") } val value = arr(front) front = (front + 1) % maxSize // 将 front 通过取模的方式后移,注意与 front = front + 1 的区别 return value } // 显示环形队列的所有数据 def showQueue(): Unit = { // 显示队列数据之前,先判断队列是否为空 if (isEmpty()) { println("队列为空,没有数据可显示...") return } // 思路:从 front 取,取出几个元素 for (i <- front until front + size()) { printf("arr[%d]=%d\n", i % maxSize, arr(i % maxSize)) } } // 求出当前环形队列有几个元素 def size(): Int = { // 算法 (rear + maxSize - front) % maxSize } // 查看队列的头元素,但是不是改变队列 def headQueue(): Any = { if (isEmpty()) { return new Exception("队列为空,没有头元素可查看") } // 这里注意,不要去改变 fornt 值 return arr(front) } } ```
标签:
Scala
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1236.html
上一篇
Scala稀疏数组练习
下一篇
Scala单向链表练习
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Filter
Sentinel
Flink
GET和POST
Tomcat
MyBatis
Hive
NIO
FileBeat
SQL练习题
数据结构和算法
Kafka
Redis
字符串
Zookeeper
Java编程思想
哈希表
ajax
随笔
Kibana
线程池
链表
Hadoop
查找
Thymeleaf
工具
二叉树
BurpSuite
Jenkins
MyBatis-Plus
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭