数据结构实验报告-队列

   

一、实验目的

1.掌握队列的定义、特点和逻辑结构,理解队列的抽象数据类型。

2.熟练掌握循环队列的结构类型定义、特点和基于循环队列的基本运算的实现。熟练掌握链3.队列的结构类型定义、特点和基于链队列的基本运算的实现。掌握队列的应用。

二、实验内容

1.编写循环队列基本运算的算法。假设此循环队列中只设 rear 和 length 来分别指示队尾元素的位置和队中元素的个数,试给出判别此循环队列的队满、队空、出队和入队的算法,要求出队时返回队头元素。

#include <stdio.h>

#define MAX_SIZE 100

typedef struct {

    int items[MAX_SIZE];

    int rear;

    int length;

} Queue;

void init_queue(Queue *q) {

    q->rear = -1;

    q->length = 0;

}

int is_full(Queue *q) {

    return q->length == MAX_SIZE;

}

int is_empty(Queue *q) {

    return q->length == 0;

}

int dequeue(Queue *q) {

    int front_element = q->items[0];

    for (int i = 0; i < q->length - 1; i++) {

        q->items[i] = q->items[i + 1];

    }

    q->length--;

    q->rear--;

    return front_element;

}

void enqueue(Queue *q, int item) {

    if (is_full(q)) {

        printf("Queue is full.\n");

        return;

    }

    q->items[(q->rear + 1) % MAX_SIZE] = item;

    q->rear++;

    q->length++;

}

int main() {

    Queue q;

    init_queue(&q);

    enqueue(&q, 1);

    enqueue(&q, 2);

    enqueue(&q, 3);

    while (!is_empty(&q)) {

        printf("Dequeued: %d\n", dequeue(&q));

    }

    return 0;

}

2.请编写一个完整的程序,使用顺序表实现以下任务。

(1)产生50个1~100的随机整数,将其中的偶数依次保存到顺序表中。

(2)输出顺序表的所有元素,并求顺序表的长度。

(3)在顺序表中指定位置 i 处,插入一个新产生1~100的随机整数。

(4)删除顺序表中值为 x 的结点或指定位置 i 的结点。

(5)将顺序表按升序排列,并输出排序结果。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

#include <stdlib.h>

typedef struct Node {

    int data;

    struct Node* next;

} Node;

typedef struct {

    Node* front;

    Node* rear;

} Queue;

void init_queue(Queue* q) {

    q->front = NULL;

    q->rear = NULL;

}

void enqueue(Queue* q, int item) {

    Node* new_node = (Node*)malloc(sizeof(Node));

    new_node->data = item;

    new_node->next = NULL;

    if (q->rear == NULL) {

        q->front = new_node;

        q->rear = new_node;

    }

    else {

        q->rear->next = new_node;

        q->rear = new_node;

    }

    Node* current = q->front;

    while (current != NULL) {

        printf("%d ", current->data);

        current = current->next;

    }

    printf("\n");

}

int dequeue(Queue* q) {

    if (q->front == NULL) {

        printf("Queue is empty.\n");

        return -1;

    }

    int front_element = q->front->data;

    Node* temp = q->front;

    q->front = q->front->next;

    free(temp);

    Node* current = q->front;

    while (current != NULL) {

        printf("%d ", current->data);

        current = current->next;

    }

    printf("\n");

    return front_element;

}

int main() {

    Queue q;

    init_queue(&q);

    int input;

    do {

        printf("Enter a number (0 to exit): ");

        scanf("%d", &input);

        if (input == 0) {

            break;

        }

        else if (input % 2 == 0) {

            enqueue(&q, input);

        }

        else {

            dequeue(&q);

        }

    } while (1);

  return 0;

  1. 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针,请编写相应的入队和出队算法。

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

#include <stdlib.h>

// 定义链表节点结构

struct Node {

    int data;

    struct Node* next;

};

// 定义队列结构

struct Queue {

    struct Node* rear; // 队尾指针

};

// 初始化队列

void initQueue(struct Queue* queue) {

    queue->rear = NULL;

}

// 入队操作

void enqueue(struct Queue* queue, int value) {

    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));

    if (new_node == NULL) {

        exit(1); // 内存分配失败

    }

    new_node->data = value;

    new_node->next = NULL;

    if (queue->rear == NULL) {

        new_node->next = new_node; // 新节点自环

        queue->rear = new_node;

    }

    else {

        new_node->next = queue->rear->next;

        queue->rear->next = new_node;

        queue->rear = new_node;

    }

}

// 出队操作

int dequeue(struct Queue* queue) {

    if (queue->rear == NULL) {

        printf("Queue is empty\n");

        return -1;

    }

    struct Node* front = queue->rear->next; // 队首节点

    int value = front->data;

    if (front == queue->rear) {

        queue->rear = NULL;

    }

    else {

        queue->rear->next = front->next;

    }

    free(front); // 释放出队节点的内存空间

    return value;

}

int main() {

    struct Queue queue;

    initQueue(&queue); // 初始化队列

    enqueue(&queue, 1);

    enqueue(&queue, 2);

    enqueue(&queue, 3);

    printf("%d\n", dequeue(&queue)); // 输出: 1

    printf("%d\n", dequeue(&queue)); // 输出: 2

    printf("%d\n", dequeue(&queue)); // 输出: 3

    printf("%d\n", dequeue(&queue)); // 输出: Queue is empty

    return 0;

}

三、实验心得:
在本次实验中,我们通过学习和实践掌握了队列的基本概念和原理。首先,我深入理解了队列的定义、特点和逻辑结构,以及队列作为一种抽象数据类型的重要性。通过与队列相关的诸多例子和练习,我对队列的本质有了更清晰的认识。

其次,我熟练掌握了循环队列和链队列的结构类型定义、特点和基本运算的实现方法。循环队列的环形结构使得队列的操作更为高效,而链队列则能够非常灵活地处理动态数据。通过实践操作,我更加熟悉了这两种队列结构的操作方法,并能够应用于实际问题中。

最后,在实验中我也意识到了队列在实际应用中的重要性,比如在计算机程序中的任务调度、缓冲管理等方面都能发挥重要作用。通过本次实验的学习,我不仅提升了对队列的理论认识,同时也磨练了自己对数据结构的实际操作能力,为今后进一步学习和研究数据结构打下了坚实的基础。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值