ADT - 队列

本文介绍了一种链式队列的数据结构实现方法,并详细解释了如何通过C语言进行初始化、插入、删除等核心操作。此外,还提供了完整的源代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define ERROR 0
typedef int Status;
typedef int QElemType;
typedef struct QNode {
    QElemType data;
    struct QNode * next;
}QNode, *QueuePtr;
typedef struct {
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;
//初始化队列
Status InitQueue_L(LinkQueue &Q)
{
    Q.front = (QueuePtr) malloc (sizeof(QNode));
    if (Q.front == NULL)
        exit(OVERFLOW);
    Q.front->next = NULL;
    Q.rear = Q.front;
    return OK;
}
//创建一个队列
void CreatQueue(LinkQueue &Q)
{
    int n;
    printf("请输入循环队列的长度:");
    scanf("%d",&n);
    for (int i = 1; i <=n; i++)
    {
        printf("第%d个元素为:",i);
        scanf("%d",&Q.base[Q.rear]);
        Q.rear=(Q.rear+1)%MAXQSIZE;
    }
}
// 插入元素e为Q的新的队尾元素
Status EnQueue(SqQueue &Q,QElemType e)
{
    if((Q.rear+1)%MAXQSIZE==Q.front)
        return ERROR;
    Q.base[Q.rear]=e;
    Q.rear=(Q.rear+1)%MAXQSIZE;
    return Q.base[Q.rear-1];
}

Status InsertQueue(LinkQueue &Q,QElemType e)        //插入元素e为Q的队尾元素
{
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if(!p)exit(OVERFLOW);
    p->data = e;         //赋值
    p->next = NULL;
    Q.rear->next = p;        //连接
    Q.rear = p;             //新的队尾
    return OK;
}
//删除队列
Status DeQueue(LinkQueue &Q )            //在队列不为空的情况下,删除队头元素
{
    QElemType e;
    if(Q.front==Q.rear)
     return ERROR;
    e=Q.base[Q.front];
    Q.front=(Q.front+1)%MAXQSIZE;
    return e;
}
//获取队头元素
Status GetFront(LinkQueue Q,QElemType &e)
{
    if (Q.front == Q.rear)
    {
        return ERROR;
    }
    e = Q.front->next->data;
    return e;
}
Status QueueEmpty(LinkQueue Q)
{
    if(Q.front == Q.rear)
    {
        return TRUE;
    }
    else
    {
        return ERROR;
    }
}
//输出队列
Status PrintQueue(LinkQueue Q)
{
    QNode *p;
    p = Q.front->next;
    printf("the queue is:");
    while(p != NULL)
    {
       printf("%d ", p->data);
       p = p->next;
    }
    return OK;
}
//判断队列是否为空
Status EmptyQueue(LinkQueue Q)
{
    if (Q.front->next == NULL)
    return OK;
    return ERROR;
}
//队列的销毁
void DstoryQueue(SqQueue &Q)
{
    while ( Q.front!= Q.rear)
    {
        free(&Q.base[Q.front]);
        Q.front=(Q.front+1)%MAXQSIZE;
    }
}
//清空队列
void  ClearQueue(SqQueue &Q)
{
    int i=Q.front;
    while (i != Q.rear)
    {
        i=0;
        i++;
    }
    Q.front=Q.rear=0;
}
//求队列长度
Status QueueLength(SqQueue Q)
{
    return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
//取队首元素
Status GetHead(SqQueue &Q)
{
    QElemType e;
    if(Q.front==Q.rear)
        return ERROR;
    return e=Q.base[Q.front];
}

### 使用ADT实现基于无序数组的优先队列 #### 1. 抽象数据类型定义 为了实现基于无序数组的优先队列,首先需要明确定义其抽象数据类型 (Abstract Data Type, ADT) 的操作接口。这些基本操作通常包括: - `insert(item)`:向优先队列中插入一个新的项。 - `remove_max()` 或者 `remove_min()`:移除并返回具有最高/最低优先级的元素。 - `is_empty()`:判断优先队列是否为空。 对于基于无序数组的优先队列来说,在执行`remove_max()`或`remove_min()`时,由于数组中的元素是没有排序的,因此每次都需要遍历整个数组来找到最大值或最小值的位置[^3]。 #### 2. Python 实现示例 下面是一个简单的Python类实现,展示了如何利用无序列表作为底层存储机制构建一个支持最大值提取的最大化优先队列: ```python class PriorityQueueUnorderedArray: def __init__(self): self.items = [] def insert(self, item): """ 插入新项目 """ self.items.append(item) def remove_max(self): """ 移除并返回最大的元素 """ if not self.is_empty(): max_index = 0 for i in range(1, len(self.items)): if self.items[i] > self.items[max_index]: max_index = i return self.items.pop(max_index) def is_empty(self): """ 检查队列是否为空 """ return len(self.items) == 0 def peek_max(self): """ 查看但不移除最大元素 """ if not self.is_empty(): max_item = self.items[0] for item in self.items[1:]: if item > max_item: max_item = item return max_item ``` 此代码片段实现了上述提到的功能,并且通过线性查找的方式找到了当前未排序数组中的最大值来进行移除操作。需要注意的是,这种方法的时间复杂度为O(n),其中n表示队列内的元素数量;而在最坏情况下(即当我们要移除的那个最大值位于数组末端时),还需要额外花费O(n)时间成本用于重新调整剩余部分的数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值