1

我试图做一个队列练习,我打算为给定的队列编写入队、出队、顶部和大小函数。出队功能目前给我带来了麻烦。dequeue 函数的期望结果如下所示。

(define q (make-queue))
(enqueue q 10)
(enqueue q 20)
(enqueue q 30)
(dequeue q)
10
(dequeue q)
20
(dequeue q)

我的代码目前看起来像这样

(module queue racket
  (provide make-queue enqueue dequeue top size) ;queue-tests)
  (struct queue (front back size) #:mutable #:transparent)

    (define (make-queue) (queue null null 0))

(define (enqueue q elt)
    (set-queue-size! q (+ (queue-size q) 1))
    (set-queue-back! q (cons elt (queue-back q)))
    )

(define (dequeue q)
    (cond  ((eq? (queue-size q) 0) null)
           ((null? (queue-front q))
           (begin
           (set-queue-front! q (cdr (reverse (queue-back q))))
           (set-queue-back! q null)
           (set-queue-size! q (- (queue-size q) 1))))
           (#t 
           (begin
           (set-queue-front! q (cdr (queue-front q)))
           (set-queue-size! q (- (queue-size q) 1))))))

  (define (top q)
    (cond ((eq? (queue-size q) 0) null)
          ((null? (queue-front q)) (last (queue-back q)))
          (#t (car (queue-front q)))))

  (define (size q)
    (queue-size q))

请问dequeue函数有什么问题?我对球拍相当陌生,我们将不胜感激。

4

2 回答 2

1

做一个小得多的测试用例。

(define q (make-queue))
(enqueue q "hi")
(dequeue q)

不仅如此,不要将测试用例仅仅视为printf语句。您真正想要做的是写出您知道队列状态需要在特定时间点处于的状态。并且您想用带有check-equal的真实代码来表达这些期望吗?. 在每一步之后写出队列应该是什么,然后使用check-equal? 准确捕捉您的期望和代码的不同之处。

否则,除了没有崩溃之外,您的测试用例实际上并没有“测试”任何东西。你想从你的测试用例中得到更多:你想让它们测试行为

下面是两个测试用例的例子:

(require rackunit)
;; ..  after your definitions
(let ()
   (define q (make-queue))
   (check-equal? q (queue null null 0)))

(let ()
   (define q (make-queue))
   (enqueue q 42)
   (check-equal? q (queue null '(42) 0)))

注意,我在第二个测试用例中犯了一个故意的错误!请注意,它错误地认为队列大小为零。所以修复它。:)

对出队也做同样的测试。

其他低级细节:

我不明白第三种情况。我希望在那里看到一个else,但我没有,所以我不知道那里发生了什么。

cond已经内置了一个隐式开始,所以最好说:

 (cond [<test>
        <body-1>
        <...>
        <body-n>] ...)

代替:

(cond [<test>
       (begin
         <body-1>
         <...>
         <body-n>)] ...)
于 2012-10-02T19:04:47.783 回答
1

你的问题表明你有点在海上;尤其是,您并没有感觉到您理解构成程序的各个部分。我想我会引导您在模块编写测试入队和出队功能的测试用例。

对不起,如果我误解了你的情况!

于 2012-10-02T17:52:53.830 回答