线性结构的两种常见应用之二--------- 队列(一端入,另一端出)
定义:一种可以实现“先进先出”的存储结构
分类:链式队列:(内部是链表 头用front(上)表示,尾用rear(下)表示),删除的话从front开始,删除叫 出队,插入(入对)的话从rear;
静态队列 :(用数组实现,从front(0(底部))到rear(6(顶部)),删除从front删,添 从rear添)。 静态队列通常都必须是循环队列(删减增加下标均加)
循环队列:1.静态队列为什么是循环队列?
答: 队列删减增加都是向上移动,底部空间若不加以利用会造成 浪费
2.循环队列需要几个参数来确定?
答:front(第一个元素)与rear(最后一个元素的下一个)
3.循环队列各参数含义?
答:front(第一个元素)与rear(最后一个元素的下一个),这 俩参数不同场合含义不同
1>队列初始化:两个都是0
2>队列非空:front:第一个元素,rear:最后一个元素 的下一个元素,
3>队列空:两个值相等,但不一定是0.
4.循环队列入队伪算法?
答:第一步:将值存入r所代表的位置,第二步:r 移动。
错误写法r = r+1;
正确写法:r = (r+1)%len(数组长度)。
5.循环队列出队伪算法?
答: 第一步:先把要删的值保存起来。第二部:移动f
错误写法f = f+1;
正确写法:f = (f+1)%len(数组长度)。
6.怎样判断循环队列是否为空?
答:if front ==rear,则该队列为空
7.怎么判断循环队列是否已满?
答:一个数组有n给元素,but只可以放n-1个;这样front与rear 就不会相等
f!=1时:f ==(r+1)
f ==1时:r==len(数组长度)
if((r+1)%数组长度 == f)已满 ; else 不满
算法:入队/出队
具体应用:所有和时间有关的操作都有队列的影子。
注意:上一节,(栈、队列)和链表的区别是:(栈、队列) 是由pTop向Bottom指向,由上到下
而链表是由前到后
程序:
#include<stdio.h>
#include<malloc.h>
struct Queue
{
int * pBase;
int front;
int rear;
}QUEUE,*PQUEUE;
void init(QUEUE *);
bool en_queue(QUEUE *,int val);
void traverse_queue(QUEUE *);
bool full_queue(QUEUE *);
bool out_queue(QUEUE*, int* pVal);
bool emput_queue(QUEUE *pQ);
int main(void)
{
Queue Q;
init(Q);
return 0;
int val;
}
void init(QUEUE *pQ)
{
pQ->pBase = (int *)malloc(sizeof(int)*6);
pQ->front = 0;
pQ->rear = 0;
}
bool full_queue(QUEUE *pQ,int val)
{
if((pQ->rear +1)%6 == pQ->front)
return true;
else
return false;
}
bool en_queue(QUEUE *,int val);
{
if(full_queue(pQ))
{
return false;
}
else
{
pQ->pBase[pQ->rear] = val;
pQ->rear = (pQ->rear +1)%6;
return ture;
}
}
void traverse_queue(QUEUE *);
{
int i = pQ->front;
while(i!= pQ->rear)
{
printf("%d", pQ->pBase[i]);
i = (i+1)%6;
}
printf("\n");
return;
}
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;
return false;
}
}