kekeromer 2020-05-17
这里选择用数组实现,为了队列可以复用,选择环形数组实现
import scala.io.StdIn object CircleArrayQueue { def main(args: Array[String]): Unit = { val queue = new ArrayQueue2(3) //菜单演示 var key = "" while (true){ println() println("请选择菜单") println("show:显示队列") println("add:添加数据") println("get:获取数据") println("peek:获取队列头元素") println("exit:退出程序") key = StdIn.readLine() key match { case "show" => queue.show() case "add" => println("请输入一个数") val num=StdIn.readInt() queue.addQueue(num) case "get" => //查看头元素判断 val res: Any = queue.getQueue() if (res.isInstanceOf[Exception]){ println(res.asInstanceOf[Exception].getMessage) }else{ println("队列取出的值为:"+res) } case "peek" => val res: Any = queue.peek() if (res.isInstanceOf[Exception]){ println(res.asInstanceOf[Exception].getMessage) }else{ println("当前队列头元素为:"+res) } } } } } class ArrayQueue2(arrMaxSize:Int){ val maxSize =arrMaxSize //指定队列大小 val arr = new Array[Int](maxSize) //队列中数据,存放在数组中 var front = 0 //初始化为0,表示队列的头,指向队列的第一个元素 var rear = 0 //初始化0,指向队列最后一个元素的后一个位置 //判断是否满了 def isFull():Boolean ={ (rear+1) % maxSize == front } //判断队列是否空 def isEmpty():Boolean={ rear == front } //添加数据 def addQueue(num : Int): Unit={ if (isFull()){ println("队列满了,不能加入了") return } arr(rear) =num //将rear 后移 rear =(rear+1) % maxSize } //遍历显示队列 //1.从front开始打印,打印多少个元素 //2.需要统计出该队列有多少个有效元素 def show(): Unit ={ if (isEmpty()){ println("队列空~") return } for (i <- front until front+size()){ printf("arr(%d)=%d \t",(i % maxSize),arr(i % maxSize)) } } def size():Int={ return (rear + maxSize -front) % maxSize } //取数据,可能取到数据也可能取不到数据(异常) def getQueue():Any={ if(isEmpty()){ return new Exception("队列空,没有数据") } //因为front指向队列的第一个元素 val res = arr(front) front = (front+1) % maxSize return res } //查看队列的头元素但是不取出 def peek():Any={ if (isEmpty()){ return new Exception("队列空,无数据") } return arr(front) } }