顺序队(队内元素以int为例)
定义
typedef struct
{
int* base;
int front;
int rear;
}SqQueue;
顺序队的初始化
//顺序栈的初始化
bool InitQueue(SqQueue& Q)
{
Q.base = new int[MAXSIZE];
if (!Q.base) return 0; //存储分配失败
Q.front = Q.rear = 0;
return 1;
}
判断循环队列队空与队满的几种方法
-
课本方法:
队空Q.rear == Q.front
队满(Q.rear+1) % MAXSIZE == Q.front
-
设置标记位
设置初始标记: bool flag=false
入队
Q.rear = (Q.rear + 1) % MAXSIZE;
flag = true;
出队
Q.front = (Q.front + 1) % MAXSIZE;
flag = false;
判断条件:
当队列为空时:(rear == front && flag==false)
当队列为满时:(rear == front && flag == true)
- count计数
队空:count == 0
队满:当有元素入队时,count++,count和队列的maxsize相等
顺序队入队
bool EnQeueu(SqQueue& Q, int e)
{
if ((Q.rear + 1) % MAXSIZE == Q.front) return 0; //队满
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXSIZE;
return 1;
}
顺序队出队
bool DeQueue(SqQueue& Q, int& e)
{
if (Q.front == Q.rear) return 0; //队空
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXSIZE;
}
取队头元素
int GetHead(SqQueue Q)
{
if (Q.front != Q.rear) return Q.base[Q.front];
}
链队(队内元素以int为例)
定义
//结点结构
typedef struct QNode
{
int data;
struct QNode* next;
}QNode,* QueuePtr;
//队列指针
typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
初始化
bool InitQueue(LinkQueue& Q)
{
Q.front = Q.rear = new QNode;
Q.rear->next = NULL;
return 1;
}
链队的入队
void EnQueue(LinkQueue& Q, int e)
{
//新建结点
QueuePtr p;
p = new QNode;
p->data = e;
p->next == NULL;
//入队
Q.rear->next = p;
Q.rear = p; //尾指针后移
}
链队的出队
bool DeQueue(LinkQueue& Q, int& e)
{
if (Q.front == Q.rear) return 0; //队空
QNode* p = Q.front->next;
e = p->data;
Q.front->next = p->next;
//若删除的元素为最后一个元素,需对队尾指针重新赋值,避免丢失
if (Q.front->next == Q.rear) Q.rear = Q.front;
delete p;
return 1;
}
取队头元素
int GetHead(LinkQueue Q)
{ //队非空
if (Q.front != Q.rear) return Q.front->next->data;
}