【转载】循环队列操作
不是只有排序,二叉树才叫数据结构,面试栽在基本的数组和队列,链表,栈的有的是!!!本文对循环队列的重要操作作出总结。注:为了避免队列空和满两个状态混淆,
采用空闲一个位置的方式,即N个元素空间的循环队列最多只能存放N-1个有效元素。这也是大多数教材的做法。
1) 循环队列初始化:front=rear=0;
2)入队操作:rear=(rear+1)%size;
3)出队操作:front=(front+1)%size;
4)判断是否为空队列:front==rear;
5)判断队列是否已满:front=(rear+1)%size;
6)遍历队列各元素。
#include<iostream>
#include<malloc.h>
using namespace std;
const int Qlen = 6;//循环队列的有效元素个数+1
typedef struct Queue
{
int * pBase;
int front;//队列首
int rear;//队列尾,rear指向最后有效元素的下一个位置,因为队列中能够有效存储的个数为 Qlen-1
}QUEUE,* PQUEUE;
/***************初始化一个空的循环队列 ******************/
void init_Queue(PQUEUE pQ)
{
pQ->pBase=(int *)malloc(sizeof(int)*Qlen);
if(pQ->pBase == NULL)
{
cout<<"初始化队列时,内存分配失败!"<<endl;
return ;
}
pQ->front=0;
pQ->rear =0;
}
/******* 判断循环队列是否为空 *******************/
int is_emptyQ(PQUEUE pQ)
{
if(pQ->front == pQ->rear)
return 1;
else
return 0;
}
/***************** 判断循环队列是否为满 ******************/
int is_fullQ(PQUEUE pQ)
{
if((pQ->rear+1)%Qlen== pQ->front)
return 1;
else
return 0;
}
/*****插入一个新元素 注:插入前需要先判断该队列是否已满,避免覆盖有效数据****/
void enqueue(PQUEUE pQ,int val)
{
if(is_fullQ(pQ))
{
cout<<"循环队列已满,无法入队!"<<endl;
}
else
{
pQ->pBase[pQ->rear]=val;
pQ->rear=(pQ->rear+1)%Qlen;
}
}
/****** 遍历循环队列中的各元素 ********/
void travse_Queue(PQUEUE pQ)
{
if(is_emptyQ(pQ))
{
cout<<"输入的循环队列为空,无法遍历!"<<endl;
return;
}
int i=pQ->front;
cout<<"输入的循环队列元素分别为:"<<endl;
while(i!=pQ->rear)
{
cout<<pQ->pBase[i]<<" ";
i=(i+1)%Qlen;
}
cout<<endl;
}
/****删除一个元素,并通过指针返回该数 注:删除前要判断该队列是否为空。*******/
void dequeue(PQUEUE pQ , int * val)
{
if(is_emptyQ(pQ))
{
cout<<"输入的队列为空,无法出队!"<<endl;
return ;
}
*val=pQ->pBase[pQ->front];
pQ->front=(pQ->front+1)%Qlen;
}
/***********主函数***********************/
int main( )
{
QUEUE q;
int value;
init_Queue(&q);
enqueue(&q,1);
enqueue(&q,2);
enqueue(&q,3);
enqueue(&q,4);
enqueue(&q,5);
enqueue(&q,6);
travse_Queue(&q);
dequeue(&q,&value);
cout<<"出队的元素为:"<<value<<endl;
travse_Queue(&q);
dequeue(&q,&value);
cout<<"出队的元素为:"<<value<<endl;
travse_Queue(&q);
dequeue(&q,&value);
cout<<"出队的元素为:"<<value<<endl;
travse_Queue(&q);
dequeue(&q,&value);
cout<<"出队的元素为:"<<value<<endl;
travse_Queue(&q);
dequeue(&q,&value);
cout<<"出队的元素为:"<<value<<endl;
travse_Queue(&q);
return 0;
}