范文一:使用循环队列求斐波那契数列的前n 1项
使用循环队列求斐波那契数列的前n+1项
使用循环队列求斐波那契数列的前n+1项
另一篇“k阶斐波那契数列的非递归算法”使用栈求斐波那契数列的第n项。本篇也是处于练习的目的,使用循环队列求斐波那契数列的前n+1项,算法结束时队列中保存了数列的最后k+1项。下贴出实现,读者可参照“k阶斐波那契数列的非递归算法”,自行对比。 //cyclequeue.h
typedef struct CYCLEQUEUE{
int *pEle;
int front;
int rear;
int size;
}Queue;
void initQueue(Queue &q, int size); int enQueue(Queue &q, int num); int deQueue(Queue &q);
int getFront(const Queue &q); int getRear(const Queue &q); void calc(int n, int k); void destroy(Queue &q);
//cyclequeue.cpp
#include #include "cyclequeue.h" using namespace std; void initQueue(Queue &q, int size){ q.pEle = (int*)malloc(sizeof(int)*(size+1)); //空余一个空间用于判定队列满 if(q.pEle == NULL){ cout<<"malloc failed!\n";=""><"malloc> exit(-1); } q.front = q.rear =0; q.size = size+1; } //入队 int enQueue(Queue &q, int num){ if((q.rear+1)%q.size == q.front){ cout<<"queue overflow!\n";=""><"queue> return -1; } q.pEle[q.rear] = num; q.rear = (q.rear+1)%q.size; return 1; } //出队 int deQueue(Queue &q){ if(q.front == q.rear){ cout<<"queue empty!\n";=""><"queue> return -1; } int ret = q.pEle[q.front]; q.front = (q.front+1)%q.size; return ret; } int getFront(const Queue &q){ if(q.front == q.rear) return -1; return q.pEle[q.front]; } int getRear(const Queue &q){ if(q.front == q.rear) return -1; return q.pEle[(q.rear-1+q.size)%q.size]; } void destroy(Queue &q){ free(q.pEle); q.pEle=NULL; q.size=0; cout<<"queue destroyed!\n";="" }=""><"queue> void calc(int n, int k){ if(k<2){>2){> cout<><2 unexpected!\n";="">2> return; } int i, tmp; Queue q; initQueue(q, k+1);//循环数列中最多保留最后k+1项(0到k) for(i=0; i<=k-2 &&="">=k-2><=n; ++i){="">=n;> cout<<"0 ";=""><"0> enQueue(q, 0); } for(i=k-1; i<=k &&="">=k><=n; ++i){="">=n;> cout<<"1 ";=""><"1> enQueue(q, 1); } for(i=k+1; i<=n; ++i){="">=n;> tmp = 2*getRear(q)-getFront(q);//f(m+1)=2f(m)-f(m-k); cout<><<" ";=""><"> deQueue(q); enQueue(q, tmp); } cout<<"\n";><"\n";> destroy(q); } //main.cpp #include { calc(20, 4); system("PAUSE"); return true; } ê?ó??,???óáD?óì???????êyáDμ???n+1?? áíò??a??k?×ì???????êyáDμ???μY?é??????ê?ó????óì???????êyáDμ?μún???????aò?ê???óúá? ??μ???μ???ê?ó??,???óáD?óì???????êyáDμ???n+1?????????áê?ê??óáD?D????á?êyáDμ?×?oók +1??????ìù??êμ?????á???é??????k?×ì???????êyáDμ???μY?é????????×?DD???è?? //cyclequeue.h typedef struct CYCLEQUEUE{ int *pEle; int front; int rear; int size; }Queue; void initQueue(Queue &q, int size); int enQueue(Queue &q, int num); int deQueue(Queue &q); int getFront(const Queue &q); int getRear(const Queue &q); void calc(int n, int k); void destroy(Queue &q); //cyclequeue.cpp #include #include "cyclequeue.h" using namespace std; void initQueue(Queue &q, int size){ q.pEle = (int*)malloc(sizeof(int)*(size+1)); //??óàò???????ó?óú?D???óáD?ú if(q.pEle == NULL){ cout<<"malloc failed!\n";=""><"malloc> exit(-1); } q.front = q.rear =0; q.size = size+1; } //è??ó int enQueue(Queue &q, int num){ if((q.rear+1)%q.size == q.front){ cout<<"queue overflow!\n";=""><"queue> return -1; } q.pEle[q.rear] = num; q.rear = (q.rear+1)%q.size; return 1; } //???ó int deQueue(Queue &q){ if(q.front == q.rear){ cout<<"queue empty!\n";=""><"queue> return -1; } int ret = q.pEle[q.front]; q.front = (q.front+1)%q.size; return ret; } int getFront(const Queue &q){ if(q.front == q.rear) return -1; return q.pEle[q.front]; } int getRear(const Queue &q){ if(q.front == q.rear) return -1; return q.pEle[(q.rear-1+q.size)%q.size]; } void destroy(Queue &q){ free(q.pEle); q.pEle=NULL; q.size=0; cout<<"queue destroyed!\n";="" }=""><"queue> void calc(int n, int k){ if(k<2){>2){> cout<><2 unexpected!\n";="">2> return; } int i, tmp; Queue q; initQueue(q, k+1);//?,??êyáD?D×??à??á?×?oók+1??(0μ?k) for(i=0; i<=k-2 &&="">=k-2><=n; ++i){="">=n;> cout<<"0 ";=""><"0> enQueue(q, 0); } for(i=k-1; i<=k &&="">=k><=n; ++i){="">=n;> cout<<"1 ";=""><"1> enQueue(q, 1); } for(i=k+1; i<=n; ++i){="">=n;> tmp = 2*getRear(q)-getFront(q);//f(m+1)=2f(m)-f(m-k); cout<><<" ";=""><"> deQueue(q); enQueue(q, tmp); } cout<<"\n";><"\n";> destroy(q); } //main.cpp #include { calc(20, 4); system("PAUSE"); return true; } 2. 假定一个单向循环链表来表示队列(即循环链队),该队列只设一个队尾指针rear,不设 队首指针,试编写下列各种运算的算法: 1) 向循环链队插入一个元素值为x的结点; 2) 从循环链队中删除一个结点; 3) 输出队列中所有元素; (2)创建只有一个尾指针的单向循环队列的的结构体定义和初始化操作。 问题 6对于只设一个队尾指针的循环链队,你是如何初始的?写出代码。 7)对于只设一个队尾指针的循环链队,其结点的结构是怎样定义的?写出C语言代码。 9)写出向循环链队插入一个元素值为x的结点算法的代码。时间复杂是多少? 10)写出从循环链队中删除一个结点算法,时间复杂度是多少? 11)写出输出队列中所有元素算法。 #include #include #define ElemType int typedef struct Qnode { ElemType data; struct Qnode *next; }Qnodetype; typedef struct { Qnodetype *rear; }CLqueue; //初始化并建立链队列 void creat(CLqueue *q) { Qnodetype *h; h=(Qnodetype *)malloc(sizeof(Qnodetype)); q->rear=h; q->rear->next=h; printf("初始化已完成\n"); } //入链队列 void CLappend(CLqueue *q,int x) { Qnodetype *s; s=(Qnodetype *)malloc(sizeof(Qnodetype)); s->data=x; s->next=q->rear->next; q->rear->next=s; q->rear=s; } //岀链队列 ElemType CLdelete(CLqueue *q) { Qnodetype *p; ElemType x; if(q->rear->next==q->rear) { printf("队列为空!不能出链队\n"); return 0; } else { p=q->rear->next; q->rear->next=p->next; x=p->data; free(p); return x; } } //遍历链队列 void display(CLqueue *q) { Qnodetype *p; p=q->rear->next->next; printf("\n链队列元素依次为:"); while(p!=q->rear->next) { printf("%d ",p->data); p=p->next; } printf("\n遍历链队列结束!\n"); } void menu() { system("cls"); //程序运行前淸屏 printf("\n********************链队列操作系统********************\n"); printf(" 1 建立单向循环链队列\n"); printf(" 2 入队列\n"); printf(" 3 出队列\n"); printf(" 4 输出队列元素\n"); printf(" 0 退出系统\n"); printf("\n***************************************************\n"); printf("请输入功能序号n:"); } //菜单选择 void choice() { CLqueue *q=(CLqueue*)malloc(sizeof(CLqueue)); int n,x; while(1) { menu();// 显示菜单 scanf("%d",&n); if(n==0) break; switch(n)//判断功能项 { case 1:creat(q);break; case 2:scanf("%d",&x);CLappend(q,x);break; case 3:CLdelete(q);break; case 4:display(q);break; case 0:exit(0); } system("pause"); } } //主函数 void main() { choice();//调用菜单选择 } 计算机软件设计 太原科技大学 材料科学与工程学院 计 算 机 操 作 任 务 书 专业班级 材物051401 设计人 刘凯 同组人 刘凯 孔正伟 李卫果 李增贺 罗晓斌 设计题目: 锂离子电池电容量Q与循环次数n关系的研究 设计参数: 电池电容量;循环次数 设计要求: 测得锂离子电池不同循环次数下的50个电容量数据,定量分 析锂离子电池电容量随循环次数增加而衰减的程度。 通过相关电子文献检索,在实验数据分析的基础上,撰写简单的科技(会 议)论文,掌握常用办公软件excel,word和powerpoint的使用。 设计时间: 2007年 12月 24日 至 2008 年 12 月 28 日 设计人(签字) 指导教师(签字) 教研室主任(签字) 附注:本课程设计任务书由学生附入设计说明书内。 第1页---刘凯---200514020110 计算机软件设计 锂离子电池的电容量Q与循环次数n的关系 ( 材料物理051401班 刘凯 200514020110 ) 摘 要:为了得到更合理的利用锂离子电池,使得它的循环次数达到最在,我们测得锂离子电池不同循环次数下的50个电容量数据,定量分析锂离子电池电容量随循环次数增加而衰减的程度。 关键词:循环性能;锂离子蓄电池电容量;放电倍率。 1 引言: 锂离子电池的正极活性材料主要为锂化复合氧化物, 如LiCoO2、LiNiO2、LiMn2O4, 平均工作电压均达4 V(vs Li/Li+)左右。以LiCoO2 为正极活性材料, 碳材料为负极活性材料的锂离子电池,由于具有容量高、循环寿命长、安全性能好等优点而已经成为世界上广泛使用的二次电池。尤其近年来, 随着石化能源的紧缺以及使用过程中带来的环保问题日益突出,人们希望锂离子电池能够作为清洁能源进一步满足动力型电源的需求。 通过对常温不同放电倍率的18650型锂离子蓄电池循环性能的测试表明,2 C高倍率循环的锂离子蓄电池,300次容量衰减率为l8.8,,而1C和0.5C放电倍率循环的电池容量衰减率分别为14.2, 和l0.5,。高倍率 [2]循环的Li—Co0石墨系锂离子蓄电池容量衰减严重线衍射法(XRD)、透射电子显微镜法(TEM)、扫描电子显微镜法(SEM)分析表明,循环后的正极材料结构有明显的改变,负极表面膜增厚,导致Li数量的减少及扩散通道阻 [3]塞,是引起锂离子蓄电池容量衰减的基本原因 2 实验条件: 将LiCoO和金属锂分别做为锂离子电池的正负极,做成实验电池电 2 解液为1mol/L浓度的以LiPF为溶质的(EC+PEC)溶液;用Land(蓝6 电)自动充放电仪对实验电池进行充放电实验,以0.2C倍率充放电 第2页---刘凯---200514020110 计算机软件设计 (1C=140mAh/g),电压限制在3.2—4.25V,测得不同循环次数下的50个 电容量数据。 3 实验数据处理及分析: n q n q n q n q n q 1 149.65 11 145.741 21 144.523 31 143.601 41 142.503 2 148.778 12 145.605 22 144.415 32 143.406 42 142.452 3 148.251 13 145.492 23 144.382 33 143.311 43 142.402 4 147.708 14 145.334 24 144.325 34 143.205 44 142.351 5 147.471 15 145.246 25 144.085 35 143.111 45 142.312 6 147.183 16 145.158 26 144.026 36 143.003 46 142.257 7 146.865 17 145.071 27 144.015 37 142.905 47 142.215 8 146.501 18 144.897 28 143.907 38 142.806 48 142.155 9 146.211 19 144.768 29 143.752 39 142.704 49 142.123 10 145.985 20 144.651 30 143.698 40 142.602 50 142.052 表1 锂离子电池电容量q与循环次数n的关系 151 150 149 148 147 146系列2 145 144 143 142 141 0102030405060 第3页---刘凯---200514020110 计算机软件设计 图1电容量Q与循环次数n的关系 锂离子电池电容量的衰减不同程度与以下几点因素有关:(1)锂的沉积;(2)电解液的分解;(3)活性物质的溶解;(4)电极材料的相转变;(5)表面膜不断生长。这些现象的发生与充放电制度有着密切的关 +系。负极表面仍附有部分金黄色的锂碳化合物(LiC),表明Li没有在放电时完全回到正极。这可能是正极材料结构发生变化后,锂离子扩散通电发生阻塞,无法回到正极。不同循环次数的负极材料表面形貌也有较大的差异,新电池的表面相对光滑纯净,循环528次负极表面出现了许多新的片状物和裂缝,并可观察到负极表面有一层膜,这可能是SEI膜和一些沉积物。随循环过程进行,表面沉积物膜逐渐变厚。负极表面还分散 [3]着富锂的白色物质,可能是沉积的锂微粒在解剖后和空气的反应产物曾拆开循环700次(容量保持率60 ,寿命结束)放电态的锂离子凿电池,发现电池里的电解液基本耗尽。 4 结 论 通过实验可以得出正极材料的蜕变,是导致电池容量裘减的主要原因,由不负极表面膜上沉积物的不断积累增厚导致锂离子扩散困难也加速锂离子蓄电池的容量衰减。 参考文献: (1)唐致远,谭才渊,陈玉红,崔燕,薛建军,锂离子电池的电容量 2006 Vol.30 No.5 P.383-387 (2)余仲宝,王静,万新华,刘庆国,电源技术 2004年01期 (3)石桥,周啸,电子元件与材料 2003年11期 (4)金乐,唐新村,无机化学学报 锂离子扩散系数随循环次数的关系 2007年07期 5)唐新村,黄伯云,物理化学学报 锂离子扩散系数与充/放电次数( 的关系 2007年10期 第4页---刘凯---200514020110 // hy.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include int *base; int size; int front,rear; }queue; class squeue{ public: queue qu; squeue(){ qu.size=10; qu.base=new int[qu.size]; qu.front=0; qu.rear=0; } void enqueue(int e){ qu.base [qu.rear ]=e; qu.rear =(qu.rear +1)%qu.size ; } int dehead(){ int e=qu.base [qu.front ]; qu.front =(qu.front +1)%qu.size ; return e; } int isfull(){ if((qu.rear +1)%qu.size ==qu.front ) return 1; else return 0; } int isempty(){ if(qu.front ==qu.rear ) return 0; else return 1; } }; int _tmain(int argc, _TCHAR* argv[]) { squeue sq; int i=0; while(sq.isfull ()==0)sq.enqueue (i++); while(sq.isempty ()==1){ i=sq.dehead (); cout<>< "="" ";=""> } cin>>i; return 0; } // pp.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include { int *base; int size; int front; int rear; }queue; class squeue { public: queue qu; squeue() { qu.size=100; qu.base=new int[qu.size]; qu.front=0; qu.rear=0; } void enqueue(int p) { qu.base[qu.rear]=p; qu.rear=(qu.rear+1)%qu.size; } int dehead() { int p=qu.base[qu.front]; qu.front=(qu.front+1)%qu.size; return p; } int isfull() { if((qu.rear+1)%qu.size==qu.front) return 1; else return 0; } int isempty() { if(qu.front==qu.rear) return 0; else return 1; } }; int _tmain(int argc, _TCHAR* argv[]) { squeue sq; int i=0; while(sq.isfull()==0)sq.enqueue(i++); while(sq.isempty()==1) { i=sq.dehead(); cout<><<" ";=""><"> } cin>>i; return 0; } 转载请注明出处范文大全网 » 使用循环队列求斐波那契数列的范文二:使用循环队列求斐波那契数列的前n 1项
范文三:循环队列的问题
范文四:锂离子电池电容量Q与循环次数n关系的研究
范文五:循环队列的入队出队