标签:初始 不同 数据对象 malloc lse creat let position 一维数组
队列是一种基本的数据结构
队列(Queue):具有一定操作约束的线性表
只能在一端插入,而在另一端删除
数据插入:入队列(AddQ)
数据删除:出队列(DeleteQ)
先进先出:First In First Out(FIFO)
类型名称:队列
数据对象集:一个有0个或多个元素的有穷线性表
操作集:长度为MaxSize的队列Q是Queue,队列元素item是ElementType类型
队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素位置的变量rear组成。我们通常使用循环队列,即队列头尾相连,这样就不会造成空间浪费。
typedef int Position
struct QNode{
ElementType *Data;
Position Front,Rear;
int MaxSize;
};
typedef struct QNode *Queue;
Queue CreateQueue(int MaxSize){
Queue Q=(Queue)malloc(sizeof(struct QNode));
Q->Data=(ElementType *)malloc(MaxSize*sizeof(ElementType));
Q->Front=Q->Rear=0;
Q->MaxSize=MaxSize;
return Q;
}
Rear是队列尾的位置,Front是队列头的位置,但也有一种情况是Rear是队列尾再后一个的位置,Front是队列头的位置,这样的话程序略有不同。
bool IsFull(Queue Q){
return ((Q->Rear+1)%Q->MaxSize==Q->Front);
}
void AddQ(Queue Q, ElementType X){
if(IsFull(Q))
printf("队列满");
else{
Q->Rear=(Q->Rear+1)%Q->MaxSize;
Q->Data[Q->Rear]=X;
}
}
bool IsEmpty(Queue Q){
return (Q->Front==Q->Rear);
}
具体实现的时候还要加一个flag变量,来确认是出队还是入队以判断是队列空还是满。
ElementType DeleteQ(Queue Q){
if(IsEmpty(Q)){
printf("队列空");
return ERROR;
}
else{
ElementType X=Q->Data[Q->Front];
Q->Front=(Q->Front+1)%MaxSize;
return X;
}
}
队列的链式存储结构可以用一个单链表实现,插入和删除操作分别在链表的两端进行,front指向链表头,rear指向链表尾。
typedef struct Node *PtrToNode;
struct Node{ //队列中的结点
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode Position;
struct QNode{
Position Front,Rear; //队列头尾指针
int MaxSize;
};
typedef struct QNode *Queue;
Queue CreateQueue(int MaxSize){
Queue Q=(Queue)malloc(sizeof(struct QNode));
Q->Front=Q->Rear=NULL;
Q->MaxSize=MaxSize;
return Q:
}
bool IsEmpty(Queue Q){
return (Q->Front==NULL);
}
void AddQ(Queue Q, ElementType X){
Position tmp=(PtrToNode)malloc(sizeof(struct Node));
tmp->Data=X;
tmp->Next=NULL;
Q->Rear=tmp;
}
ElementType DeleteQ(Queue Q){
Position FrontCell;
ElementType FrontElem;
if(IsEmpty(Q)){
printf("队列空");
return ERROR;
}
else{
FrontCell=Q->Front;
if(Q->Front==Q->Rear) //队列只有一个元素
Q->Front=Q->Rear=NULL;
else //队列有多个元素
Q->Front=Q->Front->Next;
FrontElem=FrontCell->Data;
free(FrontCell);
return FrontElem;
}
}
标签:初始 不同 数据对象 malloc lse creat let position 一维数组
原文地址:https://www.cnblogs.com/yoshi/p/13247104.html