仅在表尾入队,在表头出队
顺序队列
用一维数组
定义节点类型
#define MAXQSIZE 100 //最长队列长度
typedef struct{
QElemType *base;
int front,rear; //头指针和尾指针
}SqQueue;
初始化:front=reae=0;
入队: base[rear]=e; rear++;
出队: x=base[front]; front++;
表示队空:front==rear;
表示队满:rear=MAXQSIZE;
循环队列(%运算)
解决假上溢问题
插入元素 Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE;
删除元素 x=Q.base[s.front]; Q.front=(Q.front+1)%MAXQSIZE;
判断队空 rear==firont;
判断队满 (rear+1)%MAXQSIZE==front; //如果尾指针再加一与头指针,则队满
(少用一个空间)
队列的初始化
Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); //分配空间
if(!Q.base) return ERROR;内存分配失败
Q.front= Q.rear=0;
return OK;
求队列的长度 return ( (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE );
循环队列的入队
if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR; //判断队满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
循环队列的出队
if(Q.front==Q.rear) return ERROR; //判断队空
e=Q.base[Q.front]; //保存队头元素
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
取队头元素 if(Q.front!=Q.rear) return Q.base[Q.front]; //队头指针不变
链队
定义节点类型
#define MAXQSIZE 100 //最长队列长度
typedef struct Qnode{
QElemType data; //存储数据
str=ruct Qnode *next; //存取下一节点的地址
}QNode,*QueuePtr;
typedef struct{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
空队列 Q.front=Q.rear;
链队列的初始化
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front) return ERROR;
Q.front->next=NULL;
return OK;
链队列的销毁
while(Q,.front){
Q.rear=Q.front->next; free(Q.front); Q.front=Q.rear; }
return OK;
链队列的入队
p=(QueuePtr)malloc(sizeof(QNode) );
if(!p) return ERROR;
p->data; p->next=NILL;
Q.rear->next=p; Q.rear=p;
return OK;
链队列的出队
if(Q.front==Q.rear) return ERROR;
p=(QueuePtr)malloc(sizeof(QNode) );
p=Q.front->next; e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return OK;
链队列取队头元素
if(Q.front==Q.rear) return ERROR;
e=Q.front->next->data;
return OK;