【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题

【练习3.22】

a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin

返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1)。

b.证明,如果我们加入第四种操作DeleteMin,那么至少有一种操作必须花费Ω(logN)时间。

【练习3.23】

说明如何用一个数组实现三个栈。

【练习3.24】

在2.4节中用于计算斐波那契的递归例程如果在N=50下运行,栈空间有可能用完吗,为什么?

时间: 2024-08-08 01:18:29

【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题的相关文章

SICP 1.21 1.22 1.23 1.24

解:相关代码如下,时间测不出来 #lang racket (define (square x)   (* x x)) (define (smallest-divisor n)   (define (divides? a b)     (= (remainder b a) 0))   (define (next divisor)     (if (= divisor 2)         3         (+ divisor 2)))   (define (find-divisor n tes

EC读书笔记系列之12:条款22、23、24

条款22 将成员变量声明为private 记住: ★切记将成员变量声明为private.这可赋予客户访问数据的一致性.可细微划分访问控制.允诺约束条件获得保证,并提供class作者以充分的实现弹性. ★protected并不比public更具封装性 条款23 宁以non-member-non-friend替换member函数 记住: ★宁可拿non-member-non-friend函数替换member函数.这样可增加封装性.包裹弹性和机能扩充性. -----------------------

【Weiss】【第03章】练习3.18

[练习3.18]用下列语言编写检测平衡符号的程序 a.Pascal ( begin/end, ( ), [ ], { } ). b.C语言( /* */, ( ), [ ], { }). c.解释如何打印出错信息 Answer: a和b本质是一样的,就写了b小题即C语言的检测. 基本思想就是用栈,除了注释符号有一点点麻烦要查看连续两个字符,其它的几组都是很轻松愉快. 具体的细节都放到注释里了,所以在文章上没必要说太多. 这题测试代码就不放了,基本就是自己拿个文本文件改来改去,在mian函数里面就

【Weiss】【第03章】双链表例程

双链表因为多了个前向指针,需要考虑的特殊因素多了一倍 所以中间插入(这儿没写)和中间删除会比较复杂. 其它倒没什么特别的,代码如下. 测试代码 1 #include <iostream> 2 #include "double_linklist.cpp" 3 using namespace std; 4 using namespace doublelinklist; 5 template class DList<int>; 6 int main(void) 7 {

【Weiss】【第03章】链表例程

这种基础例程,如之前所提,会有一个实现和一个简单的测试代码. 链表其实没什么可说的,其实包括后面的栈和队列也没什么可说的,直接放代码吧. 下面这个是测试代码 1 #include <iostream> 2 #include "linklist.cpp" 3 using namespace std; 4 using namespace linklist; 5 template class List<int>; 6 int main(void) 7 { 8 List

【Weiss】【第03章】栈例程

写栈比队列更简单一些,毕竟只有一个数据出入口. 之前用C在程序里模拟栈代替递归的时候,直接搞个数组来实现都是非常轻松愉快的事情. 不多说,放代码. 测试代码 1 #include <iostream> 2 #include "stack.cpp" 3 using namespace std; 4 using namespace stack; 5 template class Stack<int>; 6 int main(void) 7 { 8 Stack<

【Weiss】【第03章】队列例程

前几个例程还是相当简单的,把链表即时改了一下就是队列了. 还有想了一下,决定这种例程的代码放法是:先把测试代码默认折叠放在前面,然后把实现代码默认展开放在后面. 测试代码如下: 1 #include <iostream> 2 #include "queue.cpp" 3 using namespace std; 4 using namespace queue; 5 template class Queue<int>; 6 int main(void) 7 { 8

【Weiss】【第03章】链表例程的一些修改

主要是,感觉原来的链表例程通过Node的分配形成了链表,但是没有自动消除Node的办法比较危险,一旦在clear()之前把链表赋了其它值就内存泄漏了. 所以改了析构函数,自动清理分配出来的内存.既然改了析构同时就要改拷贝合成与拷贝赋值. 然后还给链表加了个尾指针,否则每次插入都要O(N)的时间真的很蛋疼……改了以后就是O(1)了 栈.队列.双链表的到时候再改. 添加的构造函数.赋值函数.析构函数如下: 1 //构造函数,这部分直接增加在链表内部 2 public: 3 //拷贝构造函数,深拷贝

异步编程系列第03章 自己写异步代码

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而