队列元素排序

初学者,记录课后练习:
题目:
问题描述
给定一个队列,请用一系列合法的队列操作函数,比如判断队列是否为空,入队操作,出队操作,将队列中的元素从小到大排序。
输入说明
输入首先给出1个正整数N(N<1000),表示队列中元素的个数。随后按入队的顺序给出N个整数。
输出说明
在一行中输出排序后出对的序列。数字间以空格分隔,但末尾不得有多余空格。
输入样例
10 3 6 4 8 7 2 9 0 1 5
输出样例
0 1 2 3 4 5 6 7 8 9
提示
可以使用一个辅助的队列,采用循环筛选法(即第一轮将最小的选出来,第二轮将次小的选出来,以此类推

#include
#define INF 99999999
#define MAXSIZE 999

typedef struct {
	int items[MAXSIZE];
	int front;
	int rear;
}Queue;
/*定义结构体队列Queue;Queue是一个顺序队列,规定头指针front总是指向当前队头元素的前一个位置,
尾指针rear指向当前队尾元素的位置*/

void initQueue(Queue* q)
{
	q->front = q->rear = 0;
}//将队列初始化,函数没有返回值

int isEmpty(Queue* q)
{
	if (q->front == q->rear)//循环意义下,判断队空的条件
		return 1;
	else
		return 0;
}//判断队列是否为空,这个函数将会在输出队列元素时使用

void AddQ(Queue* q, int item)
{
	if ((q->rear + 1) % MAXSIZE == q->front)//循环意义下,判断队满的条件
	{
		printf("队列满");
		return;//return 后面什么也不跟,用来结束函数
	}//return是提前结束函数的唯一办法
	q->rear = (q->rear + 1) % MAXSIZE;//循环意义下队尾指针+1的操作
	q->items[q->rear] = item;//将新的元素添加到队尾
}

int DeleteQ(Queue* q)
{
	if (q->rear == q->front)//循环意义下判断队列为空的操作
	{
		printf("队列空");
		return NULL;
	}
	q->front = (q->front + 1) % MAXSIZE;//出队操作时头指针+1
	return q->items[q->front];//返回队头的元素
}

int main() {

	Queue q;
	Queue tempQ;

	initQueue(&q);
	initQueue(&tempQ);

	int N;

	scanf_s("%d", &N);//输入队列的长度N

	int m;

	for (int i = 0; i < N; i++) {
		scanf_s("%d", &m);
		AddQ(&q, m);
	}//输入队列中的N个元素

	int min;
	int i,j;

	for (i = 0; i < N; i++)
	{
		min = INF;

		for (j = i; j < N; j++)//开始一轮循环,筛选出原队列中的最小元素,并将其取出放入新队列的队尾
		{

			m = DeleteQ(&q);//m为原队列的队头元素
			if (m < min)
			{//取队头元素,与最小值比较,如果比最小值大,则将取出来的元素放到原队列的队尾
				if (min != INF) AddQ(&q, min);//如果比最小值小,则用这个元素取代最小值,将原来的最小值入队
				min = m;
			}
			else
			{
				AddQ(&q, m);
			}
		}//经过一轮循环下来,得到的最小值为队列中的最小值
		AddQ(&tempQ, min);//将这个最小值添加到新队列的队尾

	}//经过N轮循环,新队列的元素按增序排列

	printf("%d", DeleteQ(&tempQ));
	while (!isEmpty(&tempQ))
	{
		printf(" %d", DeleteQ(&tempQ));
	}
	printf("\n");
	return 0;
}

你可能感兴趣的:(笔记)