队列的顺序存储实现
//队列的顺序存储实现
#define MaxSize<储存数据元素的最大个数>
struct QNode{
ElementType Data[MaxSize];//一维数组
int rear;//记录队列尾元素位置的变量
int front;//记录队列头元素位置的变量
};
typedef struct QNode *Queue;
//循环队列:front=rear为什么无法判别队列是空还是满?
//front与rear差距有6种情况0~5 n种
//队列装载元素个数情况有7种0~6 n+1种
//用n种状态来区分n+1种情况
//解决方案:
//(1)使用额外标记:Size或者tag域,Size记录元素个数,加入元素时Size+1,删除时Size-1
//标记元素tag 0~1,插入元素时tag置1,删除元素时tag置0,查看tag值可知最后一次操作
//(2)仅使用n-1个数组空间
//1.入队列
void AddQ(Queue PtrQ,ElementType item)
{
if((PtrQ->rear+1)%MaxSize==PtrQ->front){
printf("队列满");//循环队列,5的下一位为0,使用求余函数
return;
}
PtrQ->rear=(PtrQ->rear+1)%MaxSize;
PtrQ->Data[PtrQ->rear]=item;//将item放入
}
//2.出队列
ElementType DeleteQ(Queue PtrQ)
{
if(PtrQ->front==PtrQ->rear){
printf("队列空");
return ERROR;
}
else{
PtrQ->front=(PtrQ->front+1)%MaxSize;
return PtrQ->Data[PtrQ->front];
}
}
队列的链式存储实现
//队列的链式存储实现
//front:删除操作 链表的头
//rear:插入操作
//front和rear只能+,不能-
struct Node{
ElementType Data;//域
struct Node *Next;//指针Next把链表串在一起
};
struct QNode{//链队列结构
struct Node *rear;//指向队尾结点
struct Node *front;//指向队头结点
};
typedef struct QNode *Queue;
Queue PtrQ;
//不带头结点的链式队列出队操作的一个示例
ElementType DeleteQ(Queue PtrQ)//结构指针
{
struct Node *FrontCell;
ElementType FrontElem;
if(PtrQ->front==NULL){//front不指向任何元素
printf("队列空");
return ERROR;
}
FrontCell=PtrQ->front;//如果队列不空,使front找到头个元素
if(PtrQ->front==PtrQ->rear)//若队列中只有一个元素
PtrQ->front=PtrQ->rear=NULL;//删除后队列置为空
else
PtrQ->front=PtrQ->front->Next;//指向下一个元素
FrontElem=FrontCell->Data;//把第一个元素的值保存在一个变量中
free(FrontCell);//释放被删除结点空间
return FrontElem;//返回变量的值
}
一道测试题:
现采用大小为10的数组实现一个循环队列。设在某一时刻,队列为空且此时front和rear值均为5。经过若干操作后,front为8,rear为2,问:此时队列中有多少个元素?
A.4
B.5
C.6
D.7
答案:A
解析:
1. 若队尾>队头
队列元素个数=队尾指针-队头指针
2. 若队头>队尾
队列元素个数=队尾指针-队头指针+队列容量
---------------------
作者:SpadgerZ
来源:优快云
原文:https://blog.youkuaiyun.com/SpadgerZ/article/details/65449456
版权声明:本文为博主原创文章,转载请附上博文链接!