队列
定义:一种可以先进先出的存储结构。
分类:
- 链式队列,用链表实现
- 静态队列,用数组实现(必须是循环队列)
应用:
与时间有关的操作都与队列有关都有队列的影子
为了与栈的算法区分开,
这里要使用 的指针换个名字,其实也差不多滴,
那么这里的就叫rear 就叫font
Q1:
静态队列为什么是循环队列
A1:
当一个元素出队时,
底部的元素所占的内存就无法再重复使用了。
这造成了空间浪费,
这对于计算机来说是不好的,
因此要保护空间!!
入队伪算法
将值存入r指针所代表的位置
r=(r+1)%数组长度
出队伪算法
从f指针拿走,
f=(f+1)%数组长度
记住都是不断·上移的即可。
判断循环队列是否为空
只需要判断front与rear指针所指向的值是否相同即可。
判断循环队列是否为满
判断(r+1)%数组长度==f
对以上伪代码进行编程,
具体实现代码如下:
//遍历,入队,判断等
//队列
//用front 和rear来当成数组,一次一次地进行一个又一个的操作
#include<stdio.h>
#include<malloc.h>
typedef struct Queue
{
int * pBase;
int front;
int rear;
} QUEUE;
void init (QUEUE *); //初始化
bool en_queue(QUEUE *,int val);//入队
void traverse_queue(QUEUE *); //遍历
bool full_queue(QUEUE *);//判断是否满
bool out_queue(QUEUE *,int *);//出队
bool emput_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);
en_queue(&Q,7);
traverse_queue(&Q);
if(out_queue(&Q,&val))
{
printf("succeed!\n");
}
else
{
printf("failed!\n");
}
traverse_queue(&Q);
return 0;
}
void init (QUEUE *pQ)
{
pQ->pBase=(int *)malloc(sizeof(int )*6);
//pBase这个元素代表了数组第一个元素的地址
pQ->front=0;
pQ->rear=0;
}
bool full_queue(QUEUE *pQ)
{
if((pQ->rear+1)%6==pQ->front)
return true;
else
return false;
}
bool en_queue(QUEUE *pQ, int val)
{
//val是插入的数据
if( full_queue(pQ))
return false;
else
{
pQ->pBase[pQ->rear]=val;
pQ->rear=((pQ->rear+1)%6);
return true;
}
}
void traverse_queue(QUEUE *pQ)
{
int i=pQ->front;
while( i != pQ->rear)
{
printf("%d ",pQ->pBase[i]);
i=(i+1)%6;//注意的啦
}
printf("\n");
}
bool emput_queue(QUEUE *pQ)
{
if(pQ->front==pQ->rear)
return true;
else
return false;
}
bool out_queue(QUEUE *pQ,int *pVal)
{
if (emput_queue(pQ))
{
return false;
}
else
{
*pVal=pQ->pBase[pQ->front];
pQ->front=(pQ->front+1)%6;
}
}