Scala数据结构——栈和队列

栈和队列

1.栈

思路:

	栈在编程中是一个比较常见的思想。可以简单的把栈理解为一个用来盛装信件的邮箱,每一
	次投递的信件都在之前投递的信件上边,当我们从这个邮箱中取信件时,也是从最上边
	(最晚投递进去)信件开始取,也就是先进后出。当然,有时候你可能会按照信件的紧急
	与否,决定取出的顺序,比如将最紧急的信件放在最上边,这就不是传统意义上的栈了,
	从栈底拿信件处理,就是队列的结构,如果区分优先级别,就是优先级队列。下边是一个
	栈的示意图。

栈的压入和弹出

代码:

	代码包括创建栈,栈的压入,弹出,遍历栈的元素。如下:
object Stack {
  def main(args: Array[String]): Unit = {
    val stackClass = new StackClass(10)
    stackClass.foreachStack()
  }
}

class StackClass(size: Int) {
  val maxSize: Int = size;
  val stackClass: Array[Long] = new Array[Long](size);
  var top: Int = size

  def push(j: Long): Unit = {
    top -= 1
    stackClass(top) = j
  }

  def pop(): Long = {
    top -= 1
    return stackClass(top)
  }

  def peek(): Long = {
    return stackClass(top)
  }

  def isEmpty(): Unit = {
    return (top == -1)
  }

  def isFull(): Unit = {
    return (top == size)
  }

  def foreachStack(): Unit = {
    for (elem <- stackClass) {
      if (elem != 0) {
        println(elem)
      }
    }
  }
}

2.队列

思路:

	队列和栈在计算机科学中比较类似,只是队列中,最先插入的元素,会被先拿出来,先进
先出(FIFO),栈中则是最后压入栈的元素,最先被拿出来(后进先出LIFO),队列就像排
队买奶茶一样,最先到的拍队列最前面,最先买到奶茶,越后边的越晚买到奶茶。示意图如下:

队列

代码:

import scala.io.StdIn

object ArrayQueue {
  def main(args: Array[String]): Unit = {
    var key = ""
    val arrayQue = new ArrayQue(4)
    while (true) {
      println("show:表示显示队列")
      println("exit:表示退出队列")
      println("add:表示添加元素")
      println("get:表示取数据")
      key = StdIn.readLine()
      key match {
        case "show" => arrayQue.showQueue()
        case "exit" => System.exit(0)
        case "add" => {
          println("请输入一个要添加的数字:")
          val value = StdIn.readInt()
          arrayQue.addQueue(value)
        }
        case "get" => {
          val res = arrayQue.getQueue()
          if (res.isInstanceOf[Exception]) {
            println(res.asInstanceOf[Exception].getMessage)
          }
          println(res)
        }
      }
    }


  }

  class ArrayQue(arrMaxSize: Int) {
    val maxSize = arrMaxSize
    val arr = new Array[Int](maxSize)
    var front = -1
    var rear = -1

    //判断队列是否满
    def isFull(): Boolean = {
      rear == maxSize - 1
    }

    //判断队列是否空
    def isNull(): Boolean = {
      front == rear
    }

    //添加元素
    def addQueue(n: Int) = {
      if (isFull()) {
        println("队列已满")
      }
      rear += 1
      arr(rear) = n
    }

    //获取数据
    def getQueue(): Any = {
      if (isNull()) {
        return new Exception("队列为空")
        front = -1
      }
      front += 1
      return arr(front)
    }

    //显示队列的所有数据
    def showQueue(): Unit = {
      if (isNull()) {
        println("queue is empty")
        return
      }
      for (i <- front + 1 to rear) {
        printf("arr[%d]=%d\n", i, arr(i))

      }
    }

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值