使用两个辅助的队列和非数组变量设计一个算法以使队列中的元素有序
2015-05-16 18:51
507 查看
/*使用两个辅助的队列和非数组变量设计一个算法以使队列中的元素有序*/ #include<stdio.h> #include<stdlib.h> #include<time.h> #define OK 1 #define ERROR 0 #define MAXSIZE 20 typedef int QElemType; typedef int Status; typedef struct { QElemType data[MAXSIZE]; int front; int rear; }SqQueue; //循环队列的初始化 Status InitSqQueue(SqQueue * S) { S->front=0; S->rear=0; return OK; } //循环队列的建立 Status create(SqQueue * S,int n) { srand((unsigned)time(NULL)); for(int i=0;i<n;i++) { S->data[i]=rand()%100; S->rear++; } return OK; } //循环队列的入队 Status EnQueue(SqQueue * S,QElemType e) { S->data[S->rear]=e; S->rear=(S->rear+1)%MAXSIZE; return OK; } //循环队列的出队 Status DeQueue(SqQueue * S,QElemType * e) { *e=S->data[S->front]; S->front=(S->front+1)%MAXSIZE; return OK; } //循环队列的长度 Status Length(SqQueue * S) { return (S->rear-S->front+MAXSIZE)%MAXSIZE; } //输出 void print(SqQueue * S) { printf("输出元素:\n"); int length=(S->rear-S->front+MAXSIZE)%MAXSIZE; for(int i=S->front;i<length;i++) { printf("%d ",S->data[i]); } printf("\n"); } //找出最大元素的下标 Status GetMax(SqQueue * S) { int length=Length(S); int temp=S->front; for(int i=1;i<length;i++) { if(S->data[temp]<S->data[i]) { temp=i; } } return temp; } //将最大元素放入队列Q,其余的放入队列L Status GetMaxOut(SqQueue * S,SqQueue * Q,SqQueue * L) { QElemType DeElem; int length=Length(S); QElemType MaxIndex=GetMax(S); EnQueue(Q,S->data[MaxIndex]); for(int i=0;i<length;i++) { if(i==MaxIndex) { DeQueue(S,&DeElem); continue; } DeQueue(S,&DeElem); EnQueue(L,DeElem); } InitSqQueue(S); return OK; } //排序 Status Sort(SqQueue * S,SqQueue * Q,SqQueue * L) { int length=Length(S); for(int i=0;i<length;i++) { if(i%2==0) GetMaxOut(S,Q,L); else GetMaxOut(L,Q,S); } return OK; } //将队列Q的元素出队,将队列Q的元素入队原先的队列S Status PutBackS(SqQueue * Q,SqQueue * S) { QElemType DeElem; int length=Length(Q); for(int i=0;i<length;i++) { DeQueue(Q,&DeElem); EnQueue(S,DeElem); } return OK; } int main() { SqQueue S,Q,L; int ElemNumber; InitSqQueue(&S); InitSqQueue(&Q); InitSqQueue(&L); printf("输入元素个数:\n"); scanf("%d",&ElemNumber); create(&S,ElemNumber); print(&S); Sort(&S,&Q,&L); PutBackS(&Q,&S); print(&S); return 0; }
相关文章推荐
- 使用一个辅助的队列和非数组变量设计一个算法以使队列中的元素有序
- (2)int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
- 写程序。设ha和hb分别是两个带头结点的非递减有序单链表的头指针,试设计算法,将这两个有序链表合并成一个非递增有序的单链表。要求使用原链表空间,
- 说你有一个数组,其中第i个元素是第i天给定股票的价格。设计一个算法来找到最大的利润,最多可以完成两个交易。
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 算法面试题:使用两个堆栈实现一个队列
- 要完整准确的 均以单链表作存储结构 试编写算法将A表和B表归并成一个按元素值递减有序的线性表C 【数据结构】假设有两个按元素值递增有序的线性表A和B 并要求利用原表的空间存放C。谁会么
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和
- 算法面试题——两个有序数组,将一个数组放入另一个空间很大的数组,要求合并之后依然有序,时间复杂度要求最小,不使用额外的数组。
- 已知一个矩阵 A(m*n) 的元素每行每列都按从小到大有序, 试设计一个算法判断任一给定值 k 是否在矩阵 A(m*n) 中
- 设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 两个数组,大小都为n,两个数组里有相同的元素,设计一个算法,找到两个数组中相同的元素
- 顺序栈S中有2n个元素,从栈顶到栈底的元素依次为a2n、a2n-1、…、a1。试设计一个算法:通过一个循环队列重新排列该栈中的元素,使得从栈顶到栈底的元素先偶数,后奇数
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 设A和B是两个单链表,其表中元素递增有序,使用一算法将A和B归并成一个案元素递减有序的单链表C(该程序中的功能包含了上几个博客中的部分功能)
- 设ha和hb分别是两个带头节点的费递减有序单链表的表头指针,设计以算法,将将两个有序链表合成一个非递减的有序单链表,该程序以以前发表的博客中的链表中的区别在与该立案表带有头结点
- 设顺序表a中的数据元素递增有序,试设计一个算法,将x插入到顺序表的适当位置,以保持该表的有序性。