【转载】循环队列操作

不是只有排序,二叉树才叫数据结构,面试栽在基本的数组和队列,链表,栈的有的是!!!本文对循环队列的重要操作作出总结。注:为了避免队列空和满两个状态混淆, 
采用空闲一个位置的方式,即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;
}

 

posted on 2014-04-22 20:52  fx-sg  阅读(180)  评论(0编辑  收藏  举报

导航