- 4
- 0
- 约7.16千字
- 约 40页
- 2017-12-20 发布于天津
- 举报
线性结构_习题课.ppt
程序设计题(五) 5.Fibonacci序列0,1,1,2,3,5,8,13,21,…,其中每个元素是前两个元素的和。可递归定义为: 当n=0,1时 fib(n)=n 当n=2时 fib(n)= fib(n-2)+ fib(n-1) 设计一个计算fib(n)的递归函数,并利用栈把他改写为非递归函数。 程序设计题(五) 递归算法: int fib(int n) { if (n0) return -1; if (n==0||n==1) return n; return fib(n-2)+fib(n-1); } 程序设计题(五) 非递归思想:定义一个整数num来存放结果。开始时,将n压入栈中,之后不断执行循环语句,直到栈为空:将栈顶元素(记为temp)弹出栈,如果temp是0或1,则num=num+temp;否则,将temp-1,temp-2压入栈,最终,num就是所求的值。 int nfib(int n) { int num=0,temp; PSeqStack pastack; if (n0) return -1; if (n==0||n==1) return n; push(pastack,n); while (!isEmptyStack(pastack)) { temp=top(pastack); pop(pastack); if (temp==0||temp==1) num+=temp; else { push(pastack,temp-1); push(pastack,temp-2); } } return num; } 程序设计题(六) 6. 给出当进栈的车厢的序列为 1、2、3、4、……、N 时,所有出栈的序列的程序. 程序设计题(六) 算法思想:采用递归回朔的思想,对于当前的一段长度为n的序列,那么符合出栈条件的第n+1个可能的数,要么是比前n个数中最大的那个数max都大,要么是小于max的并且没有出现在这n个数中的最大的那个数maxnotin。 程序设计题(六) #include iostream.h #define N 4 int output[N]; int exist[N]; void prt() { for(int i=0;iN;i++) cout output[i]; cout endl; } 程序设计题(六) int allstack(int depth, int max, int maxnotin) { if (depth==N) { prt(); return 1; } for(int i=max+1;i=N;i++) { output[depth]=i; exist[i-1]=1; allstack(depth+1,i,i==max+1?maxnotin:i-1); exist[i-1]=0; } 程序设计题(六) if (maxnotin!=0) { output[depth]=maxnotin; exist[maxnotin-1]=1; int j=maxnotin-2; while (j-1exist[j]) j--; allstack(depth+1,max,j+1); exist[maxnotin-1]=0; } } 程序设计题(六) 说明:对于上面的这个函数,我们只需要allstack(0,0,0)即可。 线性表,栈,队列习题课 主讲老师:姜丽红 助教:程绪文 2008.10 主要内容 顺序表 单链表(单向循环链表) 双链表(双向循环链表) 栈(顺序存储,链式存储) 队列(顺序存储,链式存储) 应用 概念题 1.简单比较线性表的顺序和链接两种存储方式各有什么主要优缺点? 概念题(一) 顺序存储: 优点:(1)在结点等长时可随机存取;(2)存储密度高,节省存储空间;(3)用结点的物理次序反映结点之间的逻辑关系。缺点:(1)插入和删除结点时要移动大量结点;(2)必须静态分配连续的空间。 概念题(一) 链接存储: 优点:(1)插入和删除比较灵活,不需要大量移动结点;(2)动态分配空间比较灵活,不需要预先申请最大的连续空间。缺点:(1)增加指针的空间开销;(2)检索必须沿链进行,不能随机存取。 概念题(二) 2.编号为1,2,3,4的四辆列车,顺序开进一个栈式结构的站台,为开出车站的顺序有多少种可能?请把他们具体写出来。 概念题(二) 方法:可以先一位一位的假设,然后逐步给出后面的可能的情况。 解:共有14种可能,分别如下: 4321,3214,3421,3241,2134, 2143,2341,
原创力文档

文档评论(0)