循环队列的实现
来源:互联网 发布:js 控制重新打开页面 编辑:程序博客网 时间:2024/06/05 01:07
/*循环队列.cpp-----------循环队列的实现*/
/*
队列:一种实现“先进先出”的数据存储结构。链式队列同链表类似,而静态队列主要以循环列表的形式出现。
如果不进行循环队列的实现,将浪费很多内存空间。
循环队列有两个参数:front和 rear 分别指向队首和队尾。插入的时候从队尾插入rear+1;删除的时候从队首删除front+1
循环队列初始化函数 init_Queue(pQueue pQ),首尾指向数组的0下标
入队函数 en_Queue(pQueue pQ,int value)检查是否已满
出队函数 De_Queue(pQueue pQ,int *pValue)检查是否为空
遍历函数 traverse_Queue(pQueue pQ);
注意:由于front和rear的大小关系不确定,因此需要用取模的方式进行下一个元素指向。
front=(front+1)%size,rear=(rear+1)%size。 其实就是为了防止队尾指向和队头指向在最后一个元素插入或者删除的时候
出现指向错误,而进行取模,其他情况不会出现指向出错。
队列满的情况判断:队列中一种两个参数,肯定是这两个数决定满与空,
空:front=rear;这个很容易理解
满:对着删除和插入的进行,很可能在某一时间front和rear进行重合,因此无法很好的判断是空还是满。
这里队列中通常用n-1个数组进行存储,空出一个元素来进行比较。很容易理解。
rear+1=rear就是满。防止过了很多轮删除、插入的情况同样需要模运算(rear+1)%size==rear
长度的求法同样有趣:(rear-front+size)%size
*/
#include <stdio.h>
#define LEN 6
typedef struct Queue
{
int data[LEN];
int front;//指向队头下标
int rear;//指向队尾下标
}Queue,*pQueue;
void init_Queue(pQueue pQ);//初始化队列
bool en_Queue(pQueue pQ,int value);//入队
bool de_Queue(pQueue pQ,int *pValue);//出队
void traverse_Queue(pQueue pQ);//遍历队列
bool is_empty(pQueue pQ);
bool is_full(pQueue pQ);
int main(void)
{
Queue Q;
int value;
init_Queue(&Q);
if( de_Queue(&Q,&value) )
{
printf("删除成功,删除的元素是:%d\n",value);
}
traverse_Queue(&Q);
if( en_Queue(&Q,1) )
{
printf("插入成功\n");
}
if( en_Queue(&Q,2) )
{
printf("插入成功\n");
}
if( en_Queue(&Q,3) )
{
printf("插入成功\n");
}
if( en_Queue(&Q,4) )
{
printf("插入成功\n");
}
if( en_Queue(&Q,5) )
{
printf("插入成功\n");
}
if( en_Queue(&Q,6) )
{
printf("插入成功\n");
}
traverse_Queue(&Q);
if( de_Queue(&Q,&value) )
{
printf("删除成功,删除的元素是:%d\n",value);
}
if( de_Queue(&Q,&value) )
{
printf("删除成功,删除的元素是:%d\n",value);
}
traverse_Queue(&Q);
return 0;
}
void init_Queue(pQueue pQ)
{
pQ->rear=pQ->front=0;//初始化指向0
}
bool en_Queue(pQueue pQ,int value)
{
//如果满了就不插了
if( is_full(pQ) )
{
printf("满了不插入了\n");
return false;
}
else
{
pQ->data[pQ->rear]=value;
pQ->rear=(pQ->rear+1)%LEN;
return true;
}
}
bool is_full(pQueue pQ)
{
//front和rear的关系是:(rear+1)%size==front的时候满。也就是再追加元素就跟队头了就满了。
if((pQ->rear+1)%LEN==pQ->front)
{
return true;
}
else
{
return false;
}
}
bool de_Queue(pQueue pQ,int *pVal)
{
//空队列的时候不再删除,不空:把删除的元素提出来,队头加一
if( is_empty(pQ) )
{
printf("空队列不再删除\n");
return false;
}
else
{
*pVal=pQ->data[pQ->front];
pQ->front=(pQ->front+1)%LEN;
return true;
}
}
bool is_empty(pQueue pQ)
{
if(pQ->front==pQ->rear)
{
return true;
}
else
{
return false;
}
}
void traverse_Queue(pQueue pQ)
{
//从队头开始找到队尾进行遍历
if( is_empty(pQ) )
{
printf("空表不进行遍历\n");
}
else
{
int i=pQ->front;
while(i!=pQ->rear)
{
printf("%d ",pQ->data[i]);
i=(i+1)%LEN;
}
printf("\n");
}
return;
}
- 队列----循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- Scrollview中嵌套ViewPager中嵌套ListView 滑动中tab固定顶部ScrollingTricks效果特效
- java进程间通信方式
- Python——logging模块学习
- 2016年阿里C/C++开发笔试程序题一
- R连接MySQL
- 循环队列的实现
- [ Android ]InputStream 和 String 转化 (备忘)
- 瑟夫环问题
- C++中的单例模式
- 很好的正则表达式教程
- Linux中点命令
- [转]SQL的四种连接-左外连接、右外连接、内连接、全连接
- 第3周工作周报-2组-王亮晶
- samba 实现不同操作系统之间的文件共享