队列

类型名称:队列

数据对象集:一个有0个或多个元素的又穷线性表。

操作集:长度为MaxSize的队列Q€Queue,队列元素item€ElementType

1,Queue CreatQueue(int MaxSize):生成长度为MaxSize的空队列;

2,int IsFaultQ(Queue Q,int MaxSize):判断队列Q是否已满;

3,void AddQ(Queue Q,ElementType item):将数据元素item插入队列Q中;

4,int IsEmpteyQ(Queue Q):判断队列Q是否为空;

5,ElementType DeleteQ(Queue Q):将队头数据元素从队列中删除并返回

 队列的顺序存储实现

队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列对位元素位置的变量rear组成;

front指向队列头元素的前一个,加一个元素rear+1,删除一个元素 front+1

#define MaxSize<储存数据元素的最大个数>
struce QNode{
          ElementType Data [MaxSize];
          int rear;
          int front;
};
typedef struct QNode *Queue;

顺环队列:

front==rear时,队列是空还是满?数组大小为n是,队列装载元素的状态有n+1种,而front和rear之间的差距只有n种。

解决方案:增加一个额外的标记 Size 或者tag域;

仅使用n-1个数组空间;

(1)入队列

复制代码
void AddQ(Queue PtrQ,ElementType item)
{
     if((PtrQ->rear+1)%MaxSize==PtrQ->front){
        print("队列满“);
         return;
        }
      PtrQ->rear=(PtrQ->rear+1)%MaxSize;
      PtrQ->Data[PtrQ->rear]=item;
}
复制代码

(2)出队列

复制代码
ElementType DeleteQ(Queue PtrQ)
{
      if(PtrQ->front==PtrQ->rear)
     {
         print("队列空”);
         return ERROR;
       }
      else
      {
       PtrQ->front=(PtrQ->front+1)%MaxSize;
       return PtrQ->Data[PtrQ->front];
       }
}
复制代码

队列的链式存储及实现

队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行;队列指针front和rear应该分别指向链表的哪一头?

复制代码
struct Node{
       ElementType Data;
       struct Node *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)
     {
      print("队列空“);
       return ERROR;
      }
     FrontCell=PtrQ->front;
     if(PtrQ->front==PtrQ->rear)  /*若队列只有一个元素*/
           PtrQ->front=PtrQ->rear=NULL; /*删除后队列置空*/
      else
            PtrQ->front=PtrQ->front->Next;
       FrontElem=FrontCell->Data;
       free(FrontCell);            /*释放被删除的结点*/
       return FrontElem;
}
复制代码

 

posted @   存在与虚无  阅读(67)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示