队列
def-队列是一种操作受限的线性表,与栈相同也不同,不同的是队列是在一端进入(入队),另一端出去(出队)。操作特性是先进先出。
队列的顺序存储结构
通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录尾元素位置的变量rear组成。
1.队列的顺序存储结构定义
#define MaxSize 100
//队列顺序存储结构定义
typedef struct {
int data[MaxSize]; //存放队列元素
int front, rear; //队的头指针和尾指针,不是真正的指针而是对应数组的下标
}SqQueue,*Queue;
初始状态(队空条件):Q.front == Q.rear==0
进队操作: 队不满时,先送值到队尾元素,再将队尾指针(下标)加1
出队操作: 队不空时,先取队头元素值,再将队头指针加1
循环队列
将顺序队列改造为一个环状的空间,称为循环队列
初始状态:Q.front=Q.rear=0
队首指针进1:Q.front=(Q.front+1)%MaxSize
队尾指针进1:Q.rear=(Q.rear+1)%MaxSize
队列长度:(Q.rear+MaxSize-Q.front)%MaxSize
2.循环队列初始化
void InitQueue(SqQueue &Q)
{
Q.rear = Q.front = 0; //初始化队首、队尾指针
}
3.判断循环队列是否为空
bool isEmpty(SqQueue Q)
{
if (Q.rear == Q.front)
{
return true;
}
else {
return false;
}
}
4.入队操作
bool EnQueue(SqQueue &Q, int x)
{
if ((Q.rear + 1) % MaxSize == Q.front)
return false; //队满
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
5.出队操作
bool DeQueue(SqQueue &Q, int &x)
{
if (Q.rear == Q.front)
return false; //队空
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize; //对头指针加1取模
return true;
}
队列的链式存储结构
实际上,队列的链式存储结构就是带有队头指针和队尾指针的单链表
1.队列链式存储结构定义
typedef struct {
int data;
struct LinkNode * next;
}LinkNode;
typedef struct {
LinkNode *front,*rear;
}LinkQueue;
2.链式队列的初始化
void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode)); //建立头结点,注意这里分配空间的是队列的指针,所以应该用指针的类型
Q.front->next = NULL; //初始为空
}
3.判断空
bool IsEmpty(LinkQueue Q)
{
if (Q.front == Q.rear)
return true;
else
return false;
}
4.入队
void EnQueue(LinkQueue &Q, int x)
{
LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL; //创建新的结点,插入到队尾
Q.rear->next = s;
Q.rear = s;
}
5.出队
bool DeQueue(LinkQueue &Q, int &x)
{
if (Q.front = Q.rear)
return false; //空队
LinkNode *p = Q.front->next;
x = p->data;
Q.front->next = p->next;
if (Q.rear == p)
Q.rear = Q.front; //若原队列中有一个节点,删除后变为空
free(p);
return true;
}