在Scala中使用数组排队队列实现的方法

时间:2011-10-19 06:59:42

标签: scala

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是在数组满时将数组加倍的函数。提前谢谢。

2 个答案:

答案 0 :(得分:2)

你没有告诉任何错误,所以这是一个黑暗的镜头,而不是讨论所选择的数据结构。

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

所以一些评论

  1. 令人惊讶的是,预防性地呼叫成长,以便下次呼叫 排队可能永远不会发生。你可能应该这样做 当你缺乏空间时入队的开始
  2. 当您再次出列并入队时,您的数据会移动到数组的右侧。因此,即使在具有非常少的项目(大小很小)的队列中,项目也可以位于阵列的右边缘,并且可能用完了空间。成长(或至少做某事)的测试应该在后面而不是在尺寸上。
  3. 因此,即使阵列有比所需更多的空间,您也可能需要增长,或至少做一些事情。如果阵列几乎已满,你应该确实增长(即使剩下一些空间,否则你冒着入队/出队周期的风险继续复制所有值并让你的表现达到O(N))但是如果有很多在自由空间中,您应该简单地将元素移回数组的开头。
  4. 总结:在入队开始时,如果后面是阵列长度,你必须

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

答案 1 :(得分:2)

如果您要测试size == 0,则应首先进行测试。

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

不变量可能类似于大小总是小于或等于数组长度 size> = 0