美文网首页
2020-11-10-数据结构与算法-14(队列scala版)

2020-11-10-数据结构与算法-14(队列scala版)

作者: 冰菓_ | 来源:发表于2020-11-15 08:15 被阅读0次

    1.队列 非环形实现

    package Arithmetic
    
    import scala.io.StdIn
    
    object Queue {
      val queue = new ArrayQueue(20)
    
      def main(args: Array[String]): Unit = {
        //初始化一个队列
    
        while (true) {
          println("请输入命令 \n\t" +
            "1.判断是否为空 \n\t" +
            "2.判断是否已满 \n\t " +
            "3.添加数据\n\t" +
            "4.展示内容\n\t" +
            "5.获取数据 \n\t" +
            "6.获取头节点\t\n")
          val str = StdIn.readLine()
          str match {
            case "1" => queue.isNull()
            case "2" => queue.isFull()
            case "3" => addData()
            case "4" => queue.show()
            case "5" =>
              val value = queue.getData()
              if (!value.isInstanceOf[Exception]) {
                println(value)
              }
            case "6" =>
              val value = queue.peek()
              if (!value.isInstanceOf[Exception]) {
                println(value)
              }
          }
        }
      }
    
      def addData() = {
        println("请输入数字")
        val i = StdIn.readInt()
        queue.addData(i)
      }
    }
    
    //用数组来模拟队列
    class ArrayQueue(maxCapacity: Int) {
      //初始化一个数组
      val queue = new Array[Int](maxCapacity-1)
      //-1是不包含数组数据的(队列的头)
      var first: Int = -1
      //表示队列添加到哪的索引
      var rear: Int = -1
    
      //判断是否满了
      def isFull(): Boolean = {
        if (first == maxCapacity) {
          println("已经满了")
          return true
        }
        else {
          println("队列没有满可以添加元素")
          false
        }
    
      }
    
      //判断队列是否为空
      def isNull(): Boolean = {
        if (first == rear) {
          println("队列是空的")
          return true
    
        }
        else {
          println("可添加元素")
          false
        }
      }
    
      //添加到队列
      def addData(number: Int) = {
        //首先rear要后移一个单位
        rear += 1
        //往数组添加数据
        queue(rear) = number
        //返回值
        true
      }
    
      //获取队列的元素,是first加1 但是原来的数据还是存在的,只是访问不到了,需要判断是否有异常
      def getData(): Any = {
        //首先判断队列是否为空
        if (isNull()) {
          throw new  Exception("空")
        }
        else {
          first += 1
          return queue(first)
        }
      }
    
      //peek方法获取头节点,但是不改变first的值
      def peek(): Any = {
        if (isNull()) {
          throw new Exception("空")
        }
        else {
          return queue(first + 1)
        }
      }
    
    
      //展示队列的内容
      def show() = {
        for (i <- first + 1 to rear) {
          printf("队列%s 内容%d \t\n", i, queue(i))
        }
      }
    }
    

    2.队列环形版

    核心思想: 用%来模拟循环(rear +1) /maxsize = first 时为满
    核心思想2:遍历元素时,假设rear节点在first节点之前采用(rear- first)就无法获取数据,采用取模的方法来获取队列到底用多少数据 (rear - first + maxCapacity) % maxCapacity

    package Arithmetic
    
    import scala.io.StdIn
    
    object CircleQueue {
      val queue = new ArrayCircleQueue(5)
    
      def main(args: Array[String]): Unit = {
        while (true) {
          println("请输入命令 \n\t" +
            "1.判断是否为空 \n\t" +
            "2.判断是否已满 \n\t " +
            "3.添加数据\n\t" +
            "4.展示内容\n\t" +
            "5.获取数据 \n\t" +
            "6.获取头节点\t\n")
          val str = StdIn.readLine()
          str match {
            case "1" => queue.isNull()
            case "2" => queue.isFull()
            case "3" => addData()
            case "4" => queue.show()
            case "5" =>
              val value = queue.getData()
              if (!value.isInstanceOf[Exception]) {
                println(value)
              }
            case "6" =>
              val value = queue.peek()
              if (!value.isInstanceOf[Exception]) {
                println(value)
              }
          }
        }
      }
    
      def addData() = {
        println("请输入数字")
        val i = StdIn.readInt()
        queue.addData(i)
      }
    
    
    }
    
    class ArrayCircleQueue(maxCapacity: Int) {
      //数组模拟队列
      val queue = new Array[Int](maxCapacity)
      //两个指针分别代表存取,初始化为0
      var first: Int = 0
      var rear: Int = 0
    
      //判断是否为空
      def isNull(): Boolean = {
        first == rear
      }
    
      //判断是否已满
      def isFull(): Boolean = {
        //最后一个节点不存储数据,%取余与first比较
        (rear + 1) % maxCapacity == first
      }
    
      //添加元素
      def addData(number: Int): Any = {
        //首尔判断是否为满
        if (isFull()) {
          println("队列已经满了")
          return
        }
        queue(rear) = number
        //rear指针后移
        rear = (rear + 1) % maxCapacity
    
      }
    
      //获取元素
      def getData(): Any = {
        //首先判断队列是否为空
        if (isNull()) {
          println("该队列为空请添加元素")
          return
        }
        //使用临时节点存储要返回的数据
        var result = queue(first)
        //后移first节点
        first = (first + 1) % maxCapacity
        //返回要get的队列数据
        return result
    
      }
    
      //获取头节点
      def peek(): Any = {
        //和非循环的写法一致
        return queue(first)
      }
    
      //遍历队列
      def show(): Any = {
        //这是一个难点,我要保证我能获取之后添加的数据
        if (isNull()) {
          println("队列为空")
          return
        }
        //遍历队列
        for (i <- first until first + size) {
          printf("array(%d)=%s \t\n", i % maxCapacity, queue(i % maxCapacity))
        }
    
      }
    
      //获取队列的长度
      def size(): Int = {
        (rear - first + maxCapacity) % maxCapacity
      }
    
    }
    

    相关文章

      网友评论

          本文标题:2020-11-10-数据结构与算法-14(队列scala版)

          本文链接:https://www.haomeiwen.com/subject/qursbktx.html