双端队列(duque)是一个可以在任一端进行插入和删除的线性表。现采用一个一维数组作为双端队
问题详情
双端队列(duque)是一个可以在任一端进行插入和删除的线性表。现采用一个一维数组作为双端队列的数据存储结构,使用c语言描述如下: deftne maxsize 32{数组中可容纳的元素个数} typedef struct { datatype elem[maxsize]; int endl,end2; }duque; 试编写两个算法add(duque QU,datatype x,int tag)和delete(duque QU,datatype&x,int tag)用以在此双端队列的任一端进行插入和删除。当tag=0时在左端endl端操作,当tag=1时在右端end2端操作。
请帮忙给出正确答案和分析,谢谢!
参考答案
正确答案:int add(eque Qudatatype xint tag)//在双端队列Qu中插入元素x若插入成功返回插入元素在QU中的下标;插入失败返回一1。tag=0表示在endl端插入;tag=1表示在end2端插入{if QU.endl=QU.end2 {prinfl(“队满”);return(一1);}switch(tag)case 0://在endl端插入{QU.endl=x;//插入XQU.endl:(QU.endl-1)MOD maxsize;//修改endlreturn(QU.endl+1)MOD maxsize);//返回插入元素的下标case 1://在end2端插入{QU.end2=X;QU.end2=(QU.end2+1)MOD maxsize;return(QU.end2一1)MOD maxsize;}}//addint delete(eque QUdatatype xint tag 1)//本算法在双端队列QU中删除元素xtag=0时从endl端删除tag=1时从end2端删除。删除成功返回1否则返回0{ if(QH.endl+1)MOD maxsize=QU.end2 {printf(”队空”);return(0);}switch(tag)case 0://从endl端删除{i=(QU.endl+1)MOD maxsize;//i是endl端最后插入的元素下标while(i!=QU.end2)&&(QU.elem[i]!=X)i=(i+1)MOD maxsize;//查找被删除元素x的位置if(QU.elem[i].--x)&&(i!=QU.end2){j=i;while((j一1+maxsize)MOD maxsize!=QH.endl)QH.elem[j]=QU.elem[(j一1+maxsize)MOD maxsize;j=(j一1+maxsize)MOD maxsize;//移动元素覆盖达到删除QU.endl=(Qu.endl+1)MOD maxsize;//修改endl指针return(1);}else return(0);}//结束从endl端删除case 1://从end2端删除{ i=(QU.end2—1+maxsize)MOD maxsize;//i是end2端最后插入的元素下标while(i!=Qu.endl)&&(QU.elem[i]!=x)i=(i一1+maxsize)MOD maxsize;//查找被删除元素X的下标if(QU.elem[i]=x)&&(i!:Qu.endl) //被删除元素找到{j=i;while((j+1)MOD maxsize!=QU.end2)Qu.elem[j]=QU.elem[(j+1)MOD maxsize;j=(j+1)MOD maxsize;//移动元素覆盖达到删除QU.end2=(QU.end2—1+maxsize)MOD maxsize;//修改end2指针return(1);//返回删除成功的信息}else return(0);//删除失败}//结束在end2端删除}//结束delete
intadd(equeQu,datatypex,inttag)//在双端队列Qu中插入元素x,若插入成功,返回插入元素在QU中的下标;插入失败返回一1。tag=0表示在endl端插入;tag=1表示在end2端插入{ifQU.endl=QU.end2{prinfl(“队满”);return(一1);}switch(tag)case0://在endl端插入{QU.endl=x;//插入XQU.endl:(QU.endl-1)MODmaxsize;//修改endlreturn(QU.endl+1)MODmaxsize);//返回插入元素的下标case1://在end2端插入{QU.end2=X;QU.end2=(QU.end2+1)MODmaxsize;return(QU.end2一1)MODmaxsize;}}//addintdelete(equeQU,datatypex,inttag1)//本算法在双端队列QU中删除元素x,tag=0时从endl端删除,tag=1时从end2端删除。删除成功返回1,否则返回0{if(QH.endl+1)MODmaxsize=QU.end2{printf(”队空”);return(0);}switch(tag)case0://从endl端删除{i=(QU.endl+1)MODmaxsize;//i是endl端最后插入的元素下标while(i!=QU.end2)&&(QU.elem[i]!=X)i=(i+1)MODmaxsize;//查找被删除元素x的位置if(QU.elem[i].--x)&&(i!=QU.end2){j=i;while((j一1+maxsize)MODmaxsize!=QH.endl)QH.elem[j]=QU.elem[(j一1+maxsize)MODmaxsize;j=(j一1+maxsize)MODmaxsize;//移动元素,覆盖达到删除QU.endl=(Qu.endl+1)MODmaxsize;//修改endl指针return(1);}elsereturn(0);}//结束从endl端删除case1://从end2端删除{i=(QU.end2—1+maxsize)MODmaxsize;//i是end2端最后插入的元素下标while(i!=Qu.endl)&&(QU.elem[i]!=x)i=(i一1+maxsize)MODmaxsize;//查找被删除元素X的下标if(QU.elem[i]=x)&&(i!:Qu.endl)//被删除元素找到{j=i;while((j+1)MODmaxsize!=QU.end2)Qu.elem[j]=QU.elem[(j+1)MODmaxsize;j=(j+1)MODmaxsize;//移动元素,覆盖达到删除QU.end2=(QU.end2—1+maxsize)MODmaxsize;//修改end2指针return(1);//返回删除成功的信息}elsereturn(0);//删除失败}//结束在end2端删除}//结束delete