数据机构-队列

目录

队列的顺序存储结构

顺序队声明

初始化队列

销毁队列

 判断队列是否为空

进队列

出队列

循环队列

初始化队列

销毁队列

判断队列是否为空

进队列

出队列

 队列的链式存储

数据节点类型声明

链队头结点

初始化队列

销毁队列

判断队列是否为空

进队列

出队列


队列的顺序存储结构

顺序队声明

typedef struct
{
  ElemType data[MaxSize];
  int front,rear;   // 队头和队尾指针
}SqQueue; 

初始化队列

void InitQueue(SqQueue *&q)
{
  q=(SqQueue *)malloc(sizeof(SqQueue));
  q->front=q->rear=-1;
}

销毁队列

void DestroyQueue(SqQueue *&q)
{
  free(q);
]

 判断队列是否为空

bool QueueEmpty(SqQueue *q)
{
  return(q->front==q->rear);
}

进队列

bool enQueue(SqQueue *&q,ElemType e)
{
  if(q->rear==MaxSize-1)  //队满上溢出
    return false;   //返回假
  q->rear++;
  q->data[q->rear]=e;  //rear位置插入元素E
  return true;
}

出队列

bool deQueue(SqQueue *&q,ElemType &e)
{
 if(q->front==q->rear)  //队空下溢出
   return false;
 q->front++;
 e=q->data[q->front];
 return true;
}

循环队列

初始化队列

void InitQueue(SqQueue *&q)
{
  q=(SqQueue *)malloc(sizeof(SqQueue));
  q=front=q->rear=;
}

销毁队列

void DestroyQueue(SqQueue *&q)
{
 free(q)
}

判断队列是否为空

bool QueueEmpty(SqQueue *q)
{
 return(q->front==q->rear);
}

进队列

bool enQueue(Squeue *&q,ELemType e)
{
  if((q->rear+1)%MaxSize==q->front)  //队满上溢出
    return false;
  q->rear=(q->rear+1)%MaxSize;
  q->data[q->rear]=e;
  return true;
}

出队列

bool deQueue(SqQueue *&q,ElemType e)
{
 if(q->front==q->rear)  // 队空下溢出
   return false;
 q->front=(q->front+1)%MaxSize;
 e=q->data[q->front];
 return trur;
}

 队列的链式存储

数据节点类型声明

typedef struct qnode
{
  ElemType data;  //存放元素
  struct qnode *next;  //下一个结点指针
}DataNode;     //链队数据节点类型

链队头结点

typedef struct
{
 DataNode *front;  //指向队首结点
 DataNode *rear;    //指向队尾结点
}LinkQuNode;  //链队结点类型

初始化队列

void DestroyQueue(LinkQuNode *&q)
{ 
  q=(LinkQuNode *)malloc(sizeof(LinkQuNode));
  q->front=q->rear=NULL;
}

销毁队列

void DestroyQueue(LinkQuNode *&q)
{
 DataNode *pre=q->front,*p;  //pre指向队首结点
 if(pre!=NULL)
 {
   p=pre->next;  //p指向pre的后继结点
   while(p!=NULL)
   {
    free(pre);
    pre=p;p=p->next;  //pre、p同步后移
   }
   free(pre};
 }
 free(q);
}
//O(n)

判断队列是否为空

bool QueueEmpty(LinkQuNode *q)
{
 return(q->rear==NULL);
}

进队列

void enQueue(LinkQuNode *&q,ElemType e)
{
  DataNode *p;
  p=(DataNode *)malloc(sizeof(DataNode));  //创建新结点
  p->data=e;
  p->next=NULL;
  if(q->rear==NULL)  //若队列为空,则新结点既是队首结点也是队尾结点
    q->front=q->rear=p;
  else
 {
   q->rear->next=p   //将结点P链到队尾,并将rear指向它
   q->rear=p;
 }
}

出队列

bool deQueue(LinkQuNode *&q,ElemType &e)
{
  DataNode *t;
  if(q->rear==NULL)  //原来队列空
    return false;
  t=q->front;
  if(q->front==q->rear)    //原来队列中只有一个结点
    q->front=q->rear=NULL;
  else                    //原来队列中有两个及两个以上的结点时
    q->front=q->front->next;
  e=t->data;
  free(t);
  return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值