队列

发布时间 2023-10-20 15:33:31作者: YE-

问:给定一串数字{0, 6, 3, 1, 7, 5, 8, 9, 2, 4},把第一个数字出队,将第二个数字放到最后;把第三个数字出队,将第四个数字放到最后;把第五个数字出队,第六个数字放到最后。以此类推,知道没有数字量,打印出所有删除的数字。

#include <stdio.h>
int main() {
    int q[101] = {0, 6, 3, 1, 7, 5, 8, 9, 2, 4}; // 初始化数组
    int head = 1, tail = 10; // 初始化头尾指针

    while (head < tail) {
        printf("%d ", q[head]); // 打印头指针指向的元素
        head++; // 移动头指针到下一个位置

        q[tail] = q[head]; // 将头指针指向的元素复制到尾指针指向的位置
        tail++; // 移动尾指针到下一个位置

        head++; // 移动头指针到下一个位置
    }

    getchar(); // 等待用户按下回车键
    getchar(); // 等待用户按下回车键
    return 0; // 返回程序结束标志
}

PS,将tail初始只指向在队列的下一个位置,为了避免和头指针重合。

通常,我们会定义结构体,将数组,head,tail放在外面,增加对队列的理解。

#include <stdio.h>

// 定义队列结构体
struct queue {
    int data[100];
    int head;
    int tail;
};

int main() {
    struct queue q;
    int i;
    
    q.head = 0; // 初始化队列头
    q.tail = 0; // 初始化队列尾

    // 从用户输入中填充队列
    for (i = 0; i < 9; i++) {
        scanf("%d", &q.data[q.tail]);
        q.tail++;
    }

    // 输出队列中的元素
    while (q.head < q.tail) {
        printf("%d ", q.data[q.head]);
        q.head++;

        // 移动数据以填充空出的位置,这可以减少数据复制操作
        if (q.head < q.tail) {
            q.data[q.tail] = q.data[q.head];
            q.tail++;
        }
    }

    getchar(); // 等待用户按下回车键
    getchar(); // 等待用户按下回车键
    return 0;  // 返回程序结束标志
}