您的位置:首页 > 其它

队列的顺序存储实现和链式存储实现

2017-03-23 21:26 337 查看
队列的顺序存储实现

//队列的顺序存储实现

#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. 若队头>队尾

队列元素个数=队尾指针-队头指针+队列容量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: