练习3-23

原文

Exercise 3.23. A deque (“double-ended queue”) is a sequence in which items can be inserted and deleted at either the front or the rear. Operations on deques are the constructor make-deque, the predicate empty-deque?, selectors front-deque and rear-deque, and mutators front-insertdeque!, rear-insert-deque!, front-delete-deque!, and rear-delete-deque!. Show how to represent deques using pairs, and give implementations of the operations.23 All operations should be accomplished in (1) steps.

补充

双端队列(double-ended queue,简称为deque)表示可以在前面或后面进行增加或删除其在元素的抽象数据类型。它也被称为头-尾链表(head-tail linked list)。Deque也可以被写作dequeue,但在技术文献或技术写作时已不合时宜,因为dequeue也是一个表示”从队列中删除“的动词。它和只能在队列一端增加或删除元素的队列抽象数据类型或者先进先出(FIFO)不同。

(注:以上内容来自维基百科)

代码

 (define (make-deque) (cons '() '())) (define (front-ptr deque) (car deque)) (define (rear-ptr deque) (cdr deque)) (define (empty-deque? deque) (null? (front-ptr deque))) (define (set-front! deque item) (set-car! deque item)) (define (set-rear! deque item) (set-cdr! deque item)) (define (get-item deque end) (if (empty-deque? deque) (error "GET-ITEM -- Can't retrieve item from empty deque" deque) (caar (end deque)))) (define (insert-deque! deque item end) (let ((new-pair (cons (cons item nil) nil))) (cond ((empty-deque? deque) (set-front! deque new-pair) (set-rear! deque new-pair)) ((eq? end 'front) (set-cdr! new-pair (front-ptr deque)) (set-cdr! (car (front-ptr deque)) new-pair) (set-front! deque new-pair)) (else (set-cdr! (rear-ptr deque) new-pair) (set-cdr! (car new-pair) (rear-ptr deque)) (set-rear! deque new-pair))))) (define (front-delete-deque deque) (cond ((empty-deque? deque) (error "FRONT-DELETE-DEQUE -- Can't delete from empty deque" deque)) (else (set-front! deque (cdr (front-ptr deque))) (or (empty-deque? deque) (set-cdr! (car (front-ptr deque)) nil))))) (define (rear-delete-deque deque) (cond ((empty-deque? deque) (error "REAR-DELETE-DEQUE -- Can't delete from empty deque" deque)) (else (set-rear! deque (cdar (rear-ptr deque))) (if (null? (rear-ptr deque)) (set-front! deque nil) (set-cdr! (rear-ptr deque) nil))))) (define (front-insert-deque! deque item) (insert-deque! deque item 'front)) (define (rear-insert-deque! deque item) (insert-deque! deque item 'rear)) (define (front-deque deque) (get-item deque front-ptr)) (define (rear-deque deque) (get-item deque rear-ptr)) (define (print-deque deque) (define (iter res dq) (if (or (null? dq) (empty-deque? dq)) (iter (append res (list (caaar dq)))(cons (cdar dq) (cdr deque))))) (iter nil deque)) 


感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,如需转载请联系本人。

转载于:https://www.cnblogs.com/NoMasp/p/4786094.html

【SICP练习】110 练习3.23相关推荐

  1. 计算机网络——知识结构体系

    计算机网络知识体系 主要知识点 一.TCP/IP概述 二.数据链路层 答:先介绍该层涉及的基本知识,再针对该层的某个协议进行详细介绍 1.点到点协议(PPP) 2.地址解析协议(ARP) 三.IP层 ...

  2. ospf避免环路_OSPF路由协议的区域防环机制

    一.区域设计原则 为了避免区域间的环路,ospf规定不允许两个非骨干区域之间直接传递路由信息,只允许在一个区域内部或者骨干区域和非骨干区域之间发布路由信息.因此,每个区域边界路由器都必须连接到骨干区域 ...

  3. MPLS 第一话 :传统IP路由的局限性

    这个暑假开始啃MPLS,内容很多,动不动就8,9台路由器,标签交换的一环接一环很容易晕,不过,MPLS真的很很有意思.当你能够搞定MPLS的时候,再看OSPF,ISIS,BGP真的有点大山望小山了.因 ...

  4. bootcmd 和 bootargs 环境变量

    内容来自<[正点原子]I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf> uboot 中有两个非常重要的环境变量 bootcmd 和 bootargs,接下来看一下这两个环境变 ...

  5. (转).Net/C# 获取字节流编码

    参阅: lion老大的: 字节流编码获取原来这么复杂,但也很简单 <字节流编码获取原来这么复杂,但也很简单> 字节流编码获取原来这么复杂 http://dev.csdn.net/Devel ...

  6. 历届奥运会中国金牌数

    历届奥运会中国金牌数 第30届伦敦 名次 国家/地区 金牌 银牌 铜牌 总数 1 美国 46 29 29 104 2 中国 38 27 23 88 3 英国 29 17 19 65 4 俄罗斯 24 ...

  7. R语言实战学习笔记-高级数据管理

    本文将从以下几个方面介绍R语言中的数据管理,1.数据处理函数 2.控制流 3.用户自定义函数 4.整合和重构 1.数据的处理函数 #实例 x<-c(1,2,3,4,5,6,7,8,9) y< ...

  8. zbb20190528 城市经纬度json

    [{"name": "北京市","log": "116.46","lat": "39.92 ...

  9. 用Python编写博客导出工具

    用Python编写博客导出工具 罗朝辉 (http://kesalin.github.io/) CC 许可,转载请注明出处 写在前面的话 我在 github 上用 octopress 搭建了个人博客, ...

最新文章

  1. converter 冷迁
  2. Spring中经典的9种设计模式,一定要记牢,Java基础教程pdf百度云
  3. 从MVC到前后端分离
  4. Linux下安装LoadRunner LoadGenerator
  5. 最受欢迎的男友职业排行榜 Top10 ,程序员排第 3
  6. 面试问到springmvc不会怎么办?看这篇就够了,springmvc面试题(共22题,含答案)
  7. chattr lsattr
  8. keras中一个LSTM的具体例子
  9. 惠普计算机图标不在桌面,我的电脑图标没了怎么办
  10. Hi3516A开发--电阻分压阻值计算
  11. idea手动执行maven命令的三种方式
  12. 《球机3D定位解析及ONVIF实现》
  13. 2.5万字讲解DDD领域驱动设计,从理论到实践掌握DDD分层架构设计,赶紧收藏起来吧
  14. FusionAccess模板制作并发放
  15. 用JAVA写一个俄罗斯方块游戏tetrisGame
  16. 【redis】发布与订阅
  17. python匠心之作——集合
  18. C++对象的底层原理都在这儿了,还敢说学不会?
  19. Shell命令:echo 命令详解
  20. 股票入门——K线理论

热门文章

  1. 轻松一下,看看vs.net2002变态的智能提示,不知道算不算bug
  2. java python算法_用Python,Java和C ++示例解释的排序算法
  3. react创建组件_如何使用React创建时间轴组件
  4. 中级前端笔试_在短短8个月内如何获得中级前端开发人员的角色
  5. (C++)string 的两种输入方式和输出方式
  6. 普通二叉树、二叉查找树、平衡二叉树常见操作汇总
  7. [scrum]2011/9/22-----第二天
  8. 数据结构(队列实现篇)
  9. c语言语系的命名风格和java系命名风格
  10. 使用photoshop 10.0制作符合社保要求的照片