package datastructure.queue
import java.util.Scanner
import scala.reflect.ClassTag
class ArrayQueue[T: ClassTag] extends java.io.Serializable with java.lang.Cloneable {
private var maxSize: Int = _ //队列最大容量
//front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素
//front 的初始值 = 0
private var front: Int = _
//rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定.
// rear 的初始值 = 0
private var rear: Int = _
private var arr: Array[T] = _ //使用数组存放数据
//创建队列的构造器
def this(size: Int) = {
this()
maxSize = size
arr = new Array[T](maxSize)
}
/**
* 判断队列是否满
* @return
*/
def isFull: Boolean = {
(rear + 1) % maxSize == front
}
/**
* 判断队列是否为空
* @return
*/
def isEmpty:Boolean = {
rear == front
}
/**
* 入队操作
* @param a 数据
*/
def addQueue(a: T): Unit = {
if( isFull ){
println("队列满,无法添加数据")
return
}
arr(rear) = a
//rear需要后移
rear = (rear+1) % maxSize
}
/**
* 出队操作
* @return
*/
def getQueue: T = {
if( isEmpty ) {
//抛出异常
throw new RuntimeException("队列为空,不能取数据")
}
//分析出front是指向队列的第一个元素
//1.先将front即队列头元素保存为一个临时变量
//2.再将front后移环形队列考虑取模
val t = arr(front)
front = (front + 1) % maxSize
t
}
/**
* 展示队列数据
* @return
*/
def showQueue(): Unit = {
if( isEmpty ) {
println("队列为空")
return
}
//从front开始遍历,遍历有效个数据的元素
for(i <- front until front+size()){
println(s"arr(${i%maxSize})=${arr(i%maxSize)}")
}
}
/**
* 当前队列有效的数据
* @return
*/
def size():Int = {
(rear+maxSize-front) % maxSize
}
/**
* 查看头数据
* @return
*/
def headQueue(): T = {
if (isEmpty ) {
throw new RuntimeException("队列为空,没有数据")
}
arr(front)
}
}
object ArrayQueue{
def apply[T: ClassTag](size: Int): ArrayQueue[T] = new ArrayQueue(size)
def main(args: Array[String]): Unit = {
val queue = new ArrayQueue[ Int ](4)
val sc = new Scanner(System.in)
var loop = true
while (loop) {
println("请输入如下字符:")
println("s(show):显示队列")
println("e(exit):退出程序")
println("a(add):添加数据到队列")
println("g(get):从队列取出数据")
println("h(head):查看队列头部")
val c = sc.next.charAt(0)
c match {
case 's' => queue.showQueue()
case 'e' =>
println("程序退出")
sc.close()
loop = false
case 'a' =>
println("输入一个数")
val i = sc.nextInt()
queue.addQueue(i)
case 'g' =>
try {
val res = queue.getQueue
println(s"取出的数据是:$res")
} catch {
case e: Exception => println(e.getMessage)
}
case 'h' =>
try {
val res = queue.headQueue()
println(s"队列头数据是:$res")
} catch {
case e: Exception => println(e.getMessage)
}
case _ =>
println("程序退出")
sc.close()
loop = false
}
}
}
}
数组模拟环形队列
最新推荐文章于 2024-07-19 23:42:30 发布