【SICP练习】110 练习3.23

本文详细介绍了双端队列(deque)的概念,一种可以在两端进行插入和删除操作的数据结构。提供了使用对(pair)来表示deque的方法,并实现了构造函数、判断空deque、获取前后元素、插入和删除等操作,所有操作均在常数时间内完成。

练习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.youkuaiyun.com/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.youkuaiyun.com/nomasp

转载于:https://my.oschina.net/nomasp/blog/503458

本研究基于扩展卡尔曼滤波(EKF)方法,构建了一套用于航天器姿态与轨道协同控制的仿真系统。该系统采用参数化编程设计,具备清晰的逻辑结构和详细的代码注释,便于用户根据具体需求调整参数。所提供的案例数据可直接在MATLAB环境中运行,无需额外预处理步骤,适用于计算机科学、电子信息工程及数学等相关专业学生的课程设计、综合实践或毕业课题。 在航天工程实践中,精确的姿态与轨道控制是保障深空探测、卫星组网及空间设施建设等任务成功实施的基础。扩展卡尔曼滤波作为一种适用于非线性动态系统的状态估计算法,能够有效处理系统模型中的不确定性与测量噪声,因此在航天器耦合控制领域具有重要应用价值。本研究实现的系统通过模块化设计,支持用户针对不同航天器平台或任务场景进行灵活配置,例如卫星轨道维持、飞行器交会对接或地外天体定点着陆等控制问题。 为提升系统的易用性与教学适用性,代码中关键算法步骤均附有说明性注释,有助于用户理解滤波器的初始化、状态预测、观测更新等核心流程。同时,系统兼容多个MATLAB版本(包括2014a、2019b及2024b),可适应不同的软件环境。通过实际操作该仿真系统,学生不仅能够深化对航天动力学与控制理论的认识,还可培养工程编程能力与实际问题分析技能,为后续从事相关技术研究或工程开发奠定基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值