循环队列合并:建立循环队列时,使用少用一个存储空间来区分队列的队空和队满。现有两个循环队列Q1,Q2,当Q1,Q2的元素数量之和小于循环队列的最大长度时,队列Q2依次出队,且Q2每个元素出队后依次入队Q1。当队列Q2为空时,求队列Q1。
答案:
1.调用函数型:
int MergeQueue(SqQueue* Q1, SqQueue* Q2)
{
DataType temp;
while (!QueueEmpty(*Q2)) { // 当Q2不为空时循环
if (!DeQueue(Q2, &temp)) { // 从Q2出队
return 0; // 出队失败,返回0
}
if (!EnQueue(Q1, temp)) { // 将出队元素入队到Q1
return 0; // 如果Q1满了,入队失败,返回0
}
}
return 1; // 合并成功,返回1
}
2.我就要自己写型:
int MergeQueue(SqQueue* Q1, SqQueue* Q2) {
// 计算两个队列中元素的总数
int count = (Q1->rear - Q1->front + QUEUESIZE) % QUEUESIZE +
(Q2->rear - Q2->front + QUEUESIZE) % QUEUESIZE;
// 检查合并后是否超过队列的最大长度
if (count >= QUEUESIZE) {
return 0; // 合并后队列溢出,返回错误
}
// 循环执行,直到Q2为空
DataType e;
while (!QueueEmpty(*Q2)) //注意*别丢了
{
DeQueue(Q2, &e); // Q2出队
EnQueue(Q1, e); // Q1入队
}
return 1; // 合并成功
}
函数接口:
int MergeQueue(SqQueue* Q1, SqQueue* Q2);
裁判测试程序样例:
#include"stdio.h"
#define QUEUESIZE 10
typedef int DataType;
typedef struct {
DataType items[QUEUESIZE];
int front, rear;
}SqQueue;
int InitQueue(SqQueue* Q)
{ /* 初始化循环队列 */
Q->front = 0;
Q->rear = 0;
return 1;
}
int QueueEmpty(SqQueue Q)
{ /* 判断循环队列是否为空 */
if (Q.rear == Q.front) return 1;
else return 0;
}
int EnQueue(SqQueue* Q, DataType e)
{ /* 入队 */
if ((Q->rear + 1) % QUEUESIZE == Q->front) {
return 0;
}
Q->items[Q->rear] = e;
Q->rear = (Q->rear + 1) % QUEUESIZE;
return 1;
}
int DeQueue(SqQueue* Q, DataType* e)
{ /* 出队 */
if (Q->front == Q->rear) {
return 0;
}
*e = Q->items[Q->front];
Q->front = (Q->front + 1) % QUEUESIZE;
return 1;
}
int TraverseQueue(SqQueue Q)
{ /* 遍历队列 */
int pos;
pos = Q.front;
while ((pos) % QUEUESIZE < Q.rear) {
printf("%d ", Q.items[pos]);
pos++;
}
printf("\n");
return 1;
}
/* 本题要求函数——合并循环队列 */
int MergeQueue(SqQueue* Q1, SqQueue* Q2); /* 合并队列 */
int main()
{
int i, input, result;
SqQueue Q1, Q2; //定义顺序表
InitQueue(&Q1);//初始化建空表
InitQueue(&Q2);
for (i = 0;; i++)
{
scanf("%d", &input); // 某些编译器要求此处改为scanf_s
if (input == -1)break;
EnQueue(&Q1, input);//插入数据
}
for (i = 0;; i++)
{
scanf("%d", &input); // 某些编译器要求此处改为scanf_s
if (input == -1)break;
EnQueue(&Q2, input);//插入数据
}
result = MergeQueue(&Q1, &Q2);
if (result > 0) TraverseQueue(Q1);//遍历
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入, -1表示输入结束。例如:
1 2 3 4 5 -1
6 7 -1
输出样例:
在这里给出相应的输出。例如:
1 2 3 4 5 6 7
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB