【问题标题】:Enqueue method of the queue implementation using an array in ScalaScala中使用数组实现队列的入队方法
【发布时间】:2011-10-19 15:25:57
【问题描述】:
def enqueue(elem: T): Unit = {      
    A(rear) = elem
    rear += 1
    size += 1
    if (size == 0) {
        front = 0 
        rear = 0
        }
    if (size == A.length) {
        grow()
        }   
    }

我正在使用一个数组来实现一个队列,我在 enqueue 方法中遇到了一些问题,但我无法弄清楚错误到底出在哪里。所以请你给我一些提示,说明我在哪里做错了。 在上面的代码中,size 是arrayqueue 中元素的数量,grow 是在数组满时使数组加倍的函数。提前谢谢你。

【问题讨论】:

    标签: scala


    【解决方案1】:

    你没有告诉任何关于哪里出了问题,所以这是在黑暗中拍摄,也没有讨论选择的数据结构。

    测试size == 0 似乎没用,在enqueue 之后大小不会为零。然而,你所做的是告诉你在出队发生时你会做什么,可能会在front 返回元素并增加front,并减少size

    所以说几句

    1. 令人惊讶的是,在下一次调用中,预防性地调用增长 排队可能永远不会发生。你可能应该在 当您缺少空间时开始排队
    2. 当您再次出队并再次入队时,您的数据将移动到数组的右侧。因此,即使在包含很少项目(大小很小)的队列中,项目也可能位于数组的右边缘,并且您可能会用完空间。增长(或至少做某事)的测试应该放在后面而不是大小上。
    3. 因此,您可能不得不增长,或者至少要做一些事情,即使阵列的空间比需要的多得多。如果数组快满了,你确实应该增长(即使还有一些空间,否则你会冒入队/出队周期的风险来继续复制所有值并让你的表现达到 O(N))但是如果有很多可用空间,您应该简单地将元素移回数组的开头。

    总结:在enqueue开始时,如果rear是数组长度,则必须

    • 如果 size 小于空间的一半,则将元素复制到数组的开头,front=0,rear = size
    • 如果大小更大,分配一个新数组并复制新数组开头的元素

    【讨论】:

      【解决方案2】:

      如果你要测试size == 0,你应该先这样做。

      如果您记录类的不变量以及方法的前置条件和后置条件,以确保每个方法都保留队列实现内部的关键属性,这可能会对您有所帮助。见http://en.wikipedia.org/wiki/Design_by_contract

      不变量可以是 size 总是小于或等于数组长度size >= 0

      【讨论】:

      • +1 用于不变量和合同,来自 CS 101 及其他方面的伟大建议。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多