队列的知识

1、定义

          只允许在表的一端进行插入(队尾),表的另一端进行删除(队头)的线性表

2、队列的存储结构

(1)顺序

结构定义:

    由一维数组,和队尾指针(队尾元素的当前位置),队头指针(队头元素的当前位置的前一个位置)

#define maxsize   100+1

typedef int elemtype;
typedef struct
{
elemtype elem[maxsize];
int front, rear;
}cqueuetp;

为解决假溢出现象,采用循环队列,方法是取余运算

入队操作:

   sq.rear=(sq.rear+1)%maxsize;

   sq.elem[sq.rear]=x;

出队操作:

   sq.front=(sq.front+1)%maxsize


队列的初始化操作:

void InitQueue(cqueuetp *sq)
{
sq->front = 0;
sq->rear = 0;

}

判断队列是否为空:

int QueueEmpty(cqueuetp *sq)
{
if (sq->front == sq->rear)
return 1;                //返回真值
return 0;
}

求队列长度:

int Size(cqueuetp *sq)
{
return ((maxsize + sq->rear - sq->front) % maxsize);  //考虑sq->rear-sq->front<0的情况
}

读取队头元素:

elemtype Head(cqueuetp *sq)
{
if (sq->front == sq->rear)
return NULL;
else
return (sq->elem[(sq->front + 1) % maxsize]); //返回队头元素值
}

入队操作:

void EnQueue(cqueuetp *sq, elemtype x)
{
if ((sq->rear + 1) % maxsize == sq->front)
printf("Overlow");
else
{
sq->rear = (sq->rear + 1) % maxsize;          //插入队尾元素
sq->elem[sq->rear] = x; 

}
}

出队操作:

elemtype DelQueue(cqueuetp *sq)
{
if (sq->rear == sq->front)
return NULL;
else
{
sq->front = (sq->front + 1) % maxsize;
return (sq->elem[sq->front]);

}
}

(2)链式

结构定义:

#define maxsize   100+1

typedef int elemtype;
typedef struct NODETYPE
{
elemtype data;
struct NODETYPE *next;
}nodetype;

typedef struct
{
nodetype *front;
nodetype *rear;
}lqueuetp;


队列初始化:

void InitQueue(lqueuetp *lq)
{
lq->front = (nodetype *)malloc(sizeof(nodetype));  //设置空队列lq

lq->front->next = NULL;

lq->front = lq->rear;
}

判断队空:

int QueueEmpty(lqueuetp *lq)
{
if (lq->front == lq->rear)
return 1;
return 0;
}

求队列长度:

int Size(lqueuetp *lq)
{
int i = 0;
nodetype *p = lq->front->next;

while (p)
{
i++;
p = p->next;
}

return i;
}

读取头元素值:

elemtype Head(lqueuetp *lq)
{
if (lq->front == lq->rear)
return NULL;
else
{
return lq->front->next->data;
}
}

入队操作:

void EnQueue(lqueuetp *lq,elemtype x)
{
nodetype *s;
s = (nodetype *)malloc(sizeof(nodetype));
s->data = x;

s->next = NULL;
lq->rear->next = s;
lq->rear = s;

}

出队操作:

elemtype DelQueue(lqueuetp *lq)
{
elemtype x;

nodetype *p;

if (lq->front == lq->rear)
return NULL;
else
{
p = lq->front->next;
lq->front->next = p->next;

if (p->next == NULL)
lq->rear = lq->front;
x = p->data;
free(p);


return x;
}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的优先队列是一种特殊的队列数据结构,其中每个元素都有一个与之关联的优先级。优先级高的元素先被处理,而优先级相同的元素按照它们被插入的顺序进行处理。 在C语言中,可以使用以下几种方式来实现优先队列: 1. 数组实现:使用数组来存储元素,并根据元素的优先级进行排序。插入元素时,需要按照优先级找到合适的位置进行插入;删除元素时,直接删除数组中的第一个元素即可。这种实现方式简单直观,但插入和删除操作的时间复杂度较高。 2. 堆实现:使用堆这种数据结构来实现优先队列。堆是一种完全二叉树,满足堆序性质:对于每个节点i,其父节点的值小于等于节点i的值。在C语言中,可以使用数组来表示堆。插入元素时,将元素插入到堆的末尾,并通过上浮操作将其调整到合适的位置;删除元素时,将堆顶元素与最后一个元素交换,并通过下沉操作将其调整到合适的位置。这种实现方式的插入和删除操作的时间复杂度为O(log n),效率较高。 3. 链表实现:使用链表来存储元素,并根据元素的优先级进行排序。插入元素时,需要按照优先级找到合适的位置进行插入;删除元素时,直接删除链表中的第一个元素即可。这种实现方式相对于数组实现来说,插入和删除操作的时间复杂度较低,但查找操作的时间复杂度较高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值