数据结构之队列

一 队列的定义

队列(Queue):是一种先进先出(First In First Out ,简称FIFO)的线性表。只允许在表的一端front进行插入,而在另一端rear进行删除。
队首(front) :允许进行删除的一端称为队首。
队尾(rear) :允许进行插入的一端称为队尾。

二 队列的分类

队列可分为静态队列和链式队列两大类。其中静态队列是用数组形式实现的,为循环队列。

三 循环队列的讲解

3.1 在循环队列中需要两个参数确定 front为队头和rear为队尾
1>初始化
front和rear的值都为0
2>队列非空
front代表队列的第一个元素。
rear指向最后一个的下一个。
3>队列空
front=rear

3.2 入队算法
1>将值存入r所代表的位置
2>r=(r+1)%数组的长度

3.3 出队算法讲解
f=(f+1)%数组的长度

3.4 循环队列为空
front和rear的值相等,则一定为空

3.5 如何判断循环队列为满
通常我们会少用一个元素,即定义数组有6个元素,其中有一个元素用来存放rear,用来判断循环队列是否满。
即如果r和f紧挨着,则队列已满。
if((r+1)%数组的长度==f)
已满
else
不满

四 静态队列代码

//静态队列  可用数组实现
#include<iostream>
#include<malloc.h>
#include<stdio.h>
using namespace std;
typedef struct QUEUE
{
 int *pBase;   //初始化内存分配空间。 
 int front;    //队头 
 int rear;     //队尾 
}queue,*Queue;
void init(Queue);  //队列初始化 
void en_queue(Queue,int); //入队
bool full(Queue); //队列是否满了 
bool out_queue(Queue,int *); //出队
bool empty(Queue);  //判断队列是否为空 
void traverse_queue(Queue); //输出便利 
int main()
{
 queue q;
 int val;
 init(&q);
 en_queue(&q,1);
 en_queue(&q,2);
 en_queue(&q,3);
 en_queue(&q,4);
 en_queue(&q,5);
 //en_queue(&q,6);
 traverse_queue(&q);
 if(out_queue(&q,&val))
 {
  cout<<"出队成功,出队的元素是:"<<val<<endl; 
 }
 else 
 {
  cout<<"fail"<<endl;
 }
 return 0;
 } 
void init(Queue q)
{
 q->pBase=(int *)malloc(sizeof(int)*6);
 q->front=0;
 q->rear=0;
}
void en_queue(Queue q,int val)
{
 if(full(q))
 cout<<"队列已满"<<endl;
 else 
 {
  q->pBase[q->rear]=val;
  q->rear=(q->rear+1)%6;
 } 
}
bool full(Queue q)
{
 if(q->front==(q->rear+1)%6)
 return true;
 else 
 return false;
}
bool empty(Queue q)
{
 if(q->front==(q->rear))
 return true;
 else 
 return false; 
} 
bool out_queue(Queue q,int *val)
{
 if(empty(q))
 {
  cout<<"队列已空"<<endl;
  return false;
 }
 else
 {
  *val=q->pBase[q->front];
  q->front=(q->front+1)%6;
  return true;
  } 
}
void traverse_queue(Queue q)
{
 int i=q->front;
 while(i!=q->rear)
 {
  cout<<q->pBase[i];
  i=(i+1)%6;
 }
 cout<<endl;
}

在这里插入图片描述

五 链式队列代码

//链表队列 
#include<iostream>
#include<malloc.h>
#include<stdio.h>
using namespace std;
typedef struct node
{
 int data;
 struct node* next;
}Node,*NODE;
typedef struct queue
{
 NODE front;
 NODE rear;
}*Queue,QUEUE;
void init(Queue);//构造一个空队列 
void in_queue(Queue,int);//入队 
void traverse_queue(Queue); //输出便利 
void out_queue(Queue,int *);  //出队 
bool empty(Queue); //队列是否为空 
int main()
{
 QUEUE q;
 int val;
 init(&q);
 in_queue(&q,1);
 in_queue(&q,2);
 in_queue(&q,3);
 in_queue(&q,4);
 in_queue(&q,5);
 traverse_queue(&q);
 out_queue(&q,&val);
 cout<<val<<endl;
 
 return 0;
} 
 void init(Queue q)
 {
  q->front=(NODE)malloc(sizeof(node));  
  if(q->front==NULL)
  {
   printf("动态内存分配失败\n");
  exit(-1); 
 }
 else 
 {
  q->rear=q->front;
  q->front->next=NULL;
 }
 }
 void in_queue(Queue q,int val)//入队  链式队列不需要判断队列是否满了 
 {
  NODE pnew=(NODE)malloc(sizeof(node));
  pnew->data=val;
  pnew->next=NULL;
  q->rear->next=pnew;
  q->rear=pnew; 
  } 
void traverse_queue(Queue q) //输出便利 
{
 NODE p;
 p=q->front->next;
 while(p!=NULL)
 {
  cout<<p->data<<" ";
  p=p->next;  
 }
 cout<<endl; 
}
void out_queue(Queue q,int *val) //出队  要判断队列是否为空 
{
 if(empty(q))
 {
  cout<<"队列内没有元素"<<endl;
 }
 else 
 {
  NODE p=q->front->next;
  *val=p->data;
  q->front->next=p->next;
  if(q->rear==p)
  q->rear=q->front;
  free(p); 
 }
} 
bool empty(Queue q)
{
 if(q->front->next==NULL)
 return true;
 else 
 return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值