李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
Scala队列练习
Leefs
2021-04-23 AM
491℃
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
244
大数据
216
工具
26
其它
25
GO
40
标签云
LeetCode刷题
队列
SpringBoot
Spring
工具
Jquery
设计模式
Flink
Golang基础
Java阻塞队列
Http
Git
Jenkins
Thymeleaf
MySQL
二叉树
稀疏数组
Spark Streaming
Java编程思想
容器深入研究
算法
散列
链表
nginx
JavaWEB项目搭建
Filter
MyBatis
Eclipse
Kibana
Typora
友情链接
申请
小刘博客
范明明
庄严博客
Mx
阿阳热爱前端
sky
陶小桃Blog