STL队列基本操作及含义
操作 | 含义 |
---|---|
front() | 返回队头元素 |
back() | 返回队尾元素 |
pop() | 队头弹出 |
size() | 返回队列大小 |
empty() | 判断队列是否为空 |
swap() | 交换队列元素 |
循环队列
(使用模运算代替单纯的加一)
存储结构
队头队尾指针为int,存放数组的为一个数组
#define MAXQSIZE 100;
typedef struct{
QELemType *base;
int front;
int rear;
}SqQueue;
初始化
步骤:
- 动态申请指定大小的数组
- 首尾指针指向0
Status InitQueue(SqQueue &Q){
Q.base=new QElemType[MAXQSIZE];
if(!Q.base)
exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
求队列长度
int QueueLength(SqQueue Q){
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
入队
步骤:
- 判断是否队满
- 将元素赋给队尾
- 队尾指针加一
Status EnQueue(SqQueue &Q,QElemType e){
if((Q.rear+1)%MAXQSIZE==Q.front)
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
出队
步骤:
- 判断是否队空
- 队头元素取值
- 队头指针加一
Status DeQueue(SqQueue &Q,QElemType &e){
if(Q.rear==Q.front)
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
取循环队列的队头元素
步骤:直接返回队头指针对应元素
SElemType GetHead(SqQueue Q){
if(Q.front!=Q.rear)
return Q.base[Q.front];
链队
存储结构
链表点结构+链表节点类型的前后指针
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkNode;
初始化
步骤:
- 创建一个新节点,头尾指针均指向该节点
- 头指针的next指向NULL
Status InitQueue(LinkNode &Q){
Q.front=Q.rear=new QNode;
Q.front->next=NULL;
return OK;
入队
步骤:
- 创建新节点,对其赋值
- 队列尾指针指向新节点
- 新节点尾队列的尾指针
Status EnQueue(LinkQueue &Q,QElemType e){
p=new QNode;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
出队
步骤:
- 判断队列是否为空
- 保留队头节点用于内存释放
- 头指针指向下一个节点
- 判断出队元素是否为最后一个节点,是则Q.rear=Q.front
Status DeQueue(LinkQueue &Q,QElemType &e){
if(Q.front==Q.rear)
return ERROR;
LinkQueue *p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)//是否为最后一个节点
Q.rear=Q.front;
delete p;
return OK;
取对头元素
步骤:
- 判断是否队空
- 存储队头节点,用于内存释放
- 取队头节点的值赋给e
- 判断出队元素是否为最后一个节点,是则Q.rear=Q.front
Status Dequeue(LinkQueue &Q,QElemType &e){
if(Q.front==Q.rear)
return ERROR;
Queue *p=Q.front->next;
e=Q.front->next->data;
if(Q.rear==p)
Q.front=Q.rear;
delete p;
return OK;