队列概念
队列是对头出、队尾入的先进先出线性表。
需要两个指针front和rear分别来指向队头和队尾。
front指向队头元素的前一个位置,rear总是指向队尾元素。
进队:rear+1
出队:front+1
队空条件:front=rear
队满条件:rear = MaxSize - 1
代码
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ERROR 0
#define OK 1
#define ElemeType_SQu int //顺序栈数据类型
#define MaxSize_SQu 100 //顺序栈最大容量
typedef int status;
typedef struct {
ElemeType_SQu data[MaxSize_SQu];
int front;//队首
int rear;//队尾
}QuType,*Queue;
void InitQueue_ln(Queue& qu)
{
qu = (Queue)malloc(sizeof(QuType));
if (!qu)exit(0);
qu->front = -1;
qu->rear = -1;
}
void DestoryQueue_ln(Queue& qu)
{
free(qu);
}
status EnQueue_ln(Queue& qu, ElemeType_SQu e)
{
if (qu->rear == MaxSize_SQu - 1)return ERROR;//如果当前队尾指针已经指向了最后一个元素位置,则队满
qu->rear += 1;
qu->data[qu->rear] = e;
return OK;
}
status DeQueue_ln(Queue& qu, ElemeType_SQu& e)
{
if (qu->front == qu->rear)return ERROR;//队空
qu->front += 1;//只需要挪动队首就行了
e = qu->data[qu->front];
return OK;
}
bool QueueEmpty_ln(Queue& qu)
{
return (qu->front == qu->rear);
}
int QueueCount_ln(Queue& qu)
{
return (qu->rear - qu->front);
}
void QueueTest()
{
ElemeType_SQu e;
Queue qu;
InitQueue_ln(qu);
if (QueueEmpty_ln(qu)) printf("Empty\n"); else printf("not empty\n");
EnQueue_ln(qu, 12);
printf("%d\n", QueueCount_ln(qu));
EnQueue_ln(qu, 23);
EnQueue_ln(qu, 78);
EnQueue_ln(qu, 102);
EnQueue_ln(qu, 456);
printf("%d\n", QueueCount_ln(qu));
if (QueueEmpty_ln(qu)) printf("Empty\n"); else printf("not empty\n");
DeQueue_ln(qu, e);
printf("%d\n", e);
DeQueue_ln(qu, e);
printf("%d\n", e);
DeQueue_ln(qu, e);
printf("%d\n", e);
DeQueue_ln(qu, e);
printf("%d\n", e);
DeQueue_ln(qu, e);
printf("%d\n", e);
if (QueueEmpty_ln(qu)) printf("Empty\n"); else printf("not empty\n");
}
int main()
{
QueueTest();
return 0;
}