R6-7 循环队列合并【可本地编译器调试】

循环队列合并:建立循环队列时,使用少用一个存储空间来区分队列的队空和队满。现有两个循环队列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

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值