Skip to content

Commit 8ef1db0

Browse files
committed
Add solution for exercise 3-21
1 parent 65d5a9d commit 8ef1db0

File tree

6 files changed

+3573
-1
lines changed

6 files changed

+3573
-1
lines changed

README.org

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
习题完成情况:
2626
- 章节一: 43/46
2727
- 章节二: 88/97
28-
- 章节三: 20/82
28+
- 章节三: 21/82
2929
- 章节四: TODO
3030
- 章节五: TODO
3131
* 运行

chapter3/exercise3-21.org

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#+LATEX_CLASS: ramsay-org-article
2+
#+LATEX_CLASS_OPTIONS: [oneside,A4paper,12pt]
3+
#+AUTHOR: Ramsay Leung
4+
5+
#+DATE: 2025-06-25 Wed 23:57
6+
* 打印输出的问题
7+
- Scheme 的标准打印不知道队列的特殊结构,仍然是按照序列进行打印
8+
- 它简单打印整个序对,因此 =((a b)b)= 中的 =b= 看起来重复,实际上只是 =rear-ptr= 指向最后一个元素
9+
* 删除后的状态
10+
- 当删除所有元素后,=front-ptr= 指向一个空序对 =()=
11+
- 但 =rear-ptr= 仍然指向最后一个被删除的元素 =b=, 因为我们只更新了 =front-ptr=
12+
- 打印为 =(() b)= 看起来像是非空队列,实际上队列是空的.
13+
14+
[[file:../img/chapter3/exercise-3-21.png]]
15+

chapter3/exercise3-21.rkt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#lang racket
2+
(require "queue.rkt")
3+
4+
(define (print-queue queue)
5+
(displayln (front-ptr queue)))
6+
7+
(module+ test
8+
(require rackunit)
9+
10+
(test-case "Test for empty queue"
11+
(define q (make-queue))
12+
(check-equal? (with-output-to-string (lambda () (print-queue q))) "()\n"))
13+
14+
(test-case "Test for queue with 2 elements"
15+
(define q (make-queue))
16+
(insert-queue! q 'a)
17+
(insert-queue! q 'b)
18+
(check-equal? (with-output-to-string (lambda () (print-queue q))) "{a b}\n"))
19+
20+
(test-case "Test for queue after deleting elements"
21+
(define q (make-queue))
22+
(insert-queue! q 'a)
23+
(insert-queue! q 'b)
24+
(check-equal? (with-output-to-string (lambda () (print-queue q))) "{a b}\n")
25+
(delete-queue! q)
26+
(check-equal? (with-output-to-string (lambda () (print-queue q))) "{b}\n")
27+
)
28+
)

chapter3/queue.rkt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#lang racket
2+
(define (front-ptr queue) (mcar queue))
3+
4+
(define (rear-ptr queue) (mcdr queue))
5+
6+
(define (set-front-ptr! queue item) (set-mcar! queue item))
7+
8+
(define (set-rear-ptr! queue item) (set-mcdr! queue item))
9+
10+
(define (empty-queue? queue) (null? (front-ptr queue)))
11+
12+
(define (make-queue) (mcons '() '()))
13+
14+
(define (front-queue queue)
15+
(if (empty-queue? queue)
16+
(error "FRONT called with an empty queue" queue)
17+
(mcar (front-ptr queue))))
18+
19+
(define (insert-queue! queue item)
20+
(let ((new-pair (mcons item '())))
21+
(cond ((empty-queue? queue)
22+
(set-front-ptr! queue new-pair)
23+
(set-rear-ptr! queue new-pair)
24+
queue)
25+
(else
26+
(set-mcdr! (rear-ptr queue) new-pair)
27+
(set-rear-ptr! queue new-pair)
28+
queue))))
29+
30+
(define (delete-queue! queue)
31+
(cond ((empty-queue? queue)
32+
(error "DELETE! called with an empty queue" queue))
33+
(else
34+
(set-front-ptr! queue (mcdr (front-ptr queue)))
35+
queue)))
36+
37+
(provide front-ptr rear-ptr set-front-ptr! set-rear-ptr! empty-queue? make-queue front-queue insert-queue! delete-queue!)

0 commit comments

Comments
 (0)