李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
Scala队列练习
Leefs
2021-04-23 AM
1097℃
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://www.lilinchao.com/archives/1236.html
上一篇
Scala稀疏数组练习
下一篇
Scala单向链表练习
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Spring
工具
机器学习
Java编程思想
Flume
Map
HDFS
MySQL
Netty
锁
JavaSE
Golang基础
算法
Nacos
Ubuntu
MyBatis-Plus
Filter
Git
CentOS
SQL练习题
GET和POST
线程池
Hadoop
ajax
数据结构
Linux
Scala
Java阻塞队列
DataWarehouse
gorm
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞