队列的顺序存储实现

本文详细解析了队列的顺序存储和链式存储实现方式,包括循环队列的空满判断难题及其解决方案,以及入队、出队操作的具体实现。同时,通过实例展示了循环队列元素计数的方法。

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

队列的顺序存储实现


//队列的顺序存储实现
 
#define MaxSize<储存数据元素的最大个数>
struct QNode{
    ElementType Data[MaxSize];//一维数组 
    int rear;//记录队列尾元素位置的变量 
    int front;//记录队列头元素位置的变量
}; 
typedef struct QNode *Queue;
 
 
//循环队列:front=rear为什么无法判别队列是空还是满?
//front与rear差距有6种情况0~5 n种 
//队列装载元素个数情况有7种0~6 n+1种
//用n种状态来区分n+1种情况 
//解决方案:
//(1)使用额外标记:Size或者tag域,Size记录元素个数,加入元素时Size+1,删除时Size-1
//标记元素tag 0~1,插入元素时tag置1,删除元素时tag置0,查看tag值可知最后一次操作 
//(2)仅使用n-1个数组空间 
 
//1.入队列
void AddQ(Queue PtrQ,ElementType item)
{
    if((PtrQ->rear+1)%MaxSize==PtrQ->front){ 
        printf("队列满");//循环队列,5的下一位为0,使用求余函数
        return;
    }
    PtrQ->rear=(PtrQ->rear+1)%MaxSize;
    PtrQ->Data[PtrQ->rear]=item;//将item放入 

 
//2.出队列
ElementType DeleteQ(Queue PtrQ)
{
    if(PtrQ->front==PtrQ->rear){
        printf("队列空");
        return ERROR;
    }
    else{
        PtrQ->front=(PtrQ->front+1)%MaxSize;
        return PtrQ->Data[PtrQ->front];
    }


队列的链式存储实现

//队列的链式存储实现
//front:删除操作 链表的头 
//rear:插入操作 
//front和rear只能+,不能- 
 
struct Node{
    ElementType Data;//域 
    struct Node *Next;//指针Next把链表串在一起 
};
struct QNode{//链队列结构 
    struct Node *rear;//指向队尾结点 
    struct Node *front;//指向队头结点 
};
typedef struct QNode *Queue;
Queue PtrQ;
 
//不带头结点的链式队列出队操作的一个示例
ElementType DeleteQ(Queue PtrQ)//结构指针 
{
    struct Node *FrontCell;
    ElementType FrontElem;
    
    if(PtrQ->front==NULL){//front不指向任何元素 
        printf("队列空");
        return ERROR;
    }
    FrontCell=PtrQ->front;//如果队列不空,使front找到头个元素 
    if(PtrQ->front==PtrQ->rear)//若队列中只有一个元素 
        PtrQ->front=PtrQ->rear=NULL;//删除后队列置为空 
    else
        PtrQ->front=PtrQ->front->Next;//指向下一个元素 
    FrontElem=FrontCell->Data;//把第一个元素的值保存在一个变量中 
    free(FrontCell);//释放被删除结点空间 
    return FrontElem;//返回变量的值 


一道测试题:
现采用大小为10的数组实现一个循环队列。设在某一时刻,队列为空且此时front和rear值均为5。经过若干操作后,front为8,rear为2,问:此时队列中有多少个元素?

A.4

B.5

C.6

D.7

答案:A

解析:

1. 若队尾>队头

队列元素个数=队尾指针-队头指针

2. 若队头>队尾

队列元素个数=队尾指针-队头指针+队列容量
--------------------- 
作者:SpadgerZ 
来源:优快云 
原文:https://blog.youkuaiyun.com/SpadgerZ/article/details/65449456 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值