循环队列的运用
问题描述:
试利用循环队列编写k阶斐波那契序列中前n+1项的算法,要求满足:f(n)<=max而f(n+1)>max,其中max为某个约定的常数。(注意:本题所用循环队列的容量仅为K,则在算法执行结束时,留在循环队列中的元素应是所求K阶斐波那契序列中的最后k项)。
问题分析:
这道题可以这样想,循环队列满时,可继续将元素入队列,覆盖以前的值即可。
代码:
View Code
总结:
还好,自己最后发现问题所在解决了。
更正:
#include<stdio.h> #include<stdlib.h> #define k 8 typedef struct{ int *base; int front; int rear; }queue; void InitQueue(queue &q){ q.base=(int *)malloc(k*sizeof(int)); if(!q.base) printf("存储分配失败");//存储分配失败 q.front=q.rear=0; } void EnQueue(queue &q,int i) { q.base[q.rear]=i; q.rear=(q.rear+1)%k; } void DeQueue(queue &q,int &i) { i=q.base[q.front]; q.front=(q.front+1)%k; } int QueueLength(queue &q) { return (q.rear-q.front+k)%k; } int fun(int m) { if(m==0) return 0; if(m==1) return 1; else return fun(m-1)+fun(m-2); } int main() { queue q; int e; InitQueue(q); int s,j=0,count=0,max; printf("请输入约定的最大数:"); scanf("%d",&max); for(int i=0;;i++) { s=fun(i); if(s<=max) { if(i>=k) DeQueue(q,e); EnQueue(q,s); j=i; ++j; s=fun(j); } if(s>max) break; } int len=k; if(i<k-1) len=QueueLength(q); while(count<len) { DeQueue(q,e); printf("%d\n",e); count++; } return 0; }