定义:队列是一种只许在一端进行插入,另一端进行删除的线性表
队列是一种先进先出的结构(FIF0)
只允许在队头出,队尾进
当队头指针和队尾指针一致时,表示为空队列
#include <stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int Status;
typedef int ElemType;
//顺序队列
typedef struct {
ElemType data[MAXSIZE];
int front;//头指针
int rear;//尾指针
}SqQueue;
Status InitQueue(SqQueue *Q){
Q->front = 0;
Q->rear = 0;
return OK;
}
Status ClearQueue(SqQueue *Q){
Q->front = 0;
Q->rear = 0;
return OK;
}
Status QueueEmpty(SqQueue Q){
if(Q.front == Q.rear){
return TRUE;
} else {
return FALSE;
}
}
/*
*获取队列的长度,注意两种情况
*1 rear>front,此时长度为rear-front
*2 rear<front,此时长度为(MAXSIZE-front)+(rear-0)
*综上,两种情况可以统一为(rear-front+MAXSIZE)%MAXSIZE
*/
int QueueLength(SqQueue Q){
int length = (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
return length;
}
Status GetHead(SqQueue Q,ElemType *e){
if(QueueEmpty(Q)){
printf("GetHead error:empty queue\n");
return ERROR;
}
*e = Q.data[Q.front];
return OK;
}
Status EnQueue(SqQueue *Q,ElemType e){
//先判断栈是否已经满
if((Q->rear + 1)%MAXSIZE == Q->front){
printf("EnQueue ERROR:full queue\n");
return ERROR;
}
Q->data[Q->rear] = e;
Q->rear = (Q->rear + 1)%MAXSIZE;
return OK;
}
Status Dequeue(SqQueue *Q,ElemType *e){
if(QueueEmpty(*Q)){
printf("Dequeue error:empty queue\n");
return ERROR;
}
*e = Q->data[Q->front];
Q->front = (Q->front+1)%MAXSIZE;
return OK;
}
void PrintQueue(SqQueue Q){
if(QueueEmpty(Q)){
printf("PrintQueue error:empty queue\n");
return;
}
int curPos = Q.front;
while(curPos%MAXSIZE != Q.rear){
printf("Queue:%d\n",Q.data[curPos]);
curPos++;
}
printf("*********************\n");
}
int main(){
SqQueue queue;
InitQueue(&queue);
EnQueue(&queue,1);
EnQueue(&queue,2);
EnQueue(&queue,3);
EnQueue(&queue,4);
EnQueue(&queue,5);
PrintQueue(queue);
int temp = 0;
Dequeue(&queue,&temp);
Dequeue(&queue,&temp);
PrintQueue(queue);
return 0;
}