本章内容:顺序队、链队的结构定义、判断队空、进队、出队以及主函数测试。
顺序队:
#include <stdio.h>
#include <stdlib.h>
#define maxsize 5
typedef struct
{
int data[maxsize];
int front;
int rear;
}Queue;
//初始化
void initQueue(Queue &Q)
{
Q.front=0;
Q.rear=0;
}
//判断为空
int isEmpty(Queue Q)
{
if(Q.front==Q.rear)
return 1;
return -1;
}
//进队
int inQueue(Queue &Q,int x)
{
//判断是否队满
if((Q.rear+1)%maxsize==Q.front)
return -1;
//rear指向最后一个元素,所以先往后指向队列后面空元素再赋值
Q.rear=(Q.rear+1)%maxsize;
Q.data[Q.rear]=x;
return 1;
}
//出队
int outQueue(Queue &Q,int x)
{
//判断是否队空
if(Q.front==Q.rear)
return -1;
//front指向队列前面空指针,所以先往后移动再出队,出此时front指针的data,(值不用改变,根据指针来判断,他有数值也是空)
Q.front=(Q.front+1)%maxsize;
x=Q.data[Q.front];
return x;
}
int main()
{
//关于为何是maxsize=5,却只有四个元素,详细请见数据结构课本中关于队列会有一个 预留位置 的相关知识
Queue Q;
initQueue(Q);
int x=isEmpty(Q);
printf("%d\n",x);
inQueue(Q,1);
inQueue(Q,2);
inQueue(Q,3);
inQueue(Q,4);
//测试队满入队
printf("%d\n",inQueue(Q, 99));
printf("%d\n",outQueue(Q, x));
printf("%d\n",outQueue(Q, x));
printf("%d\n",outQueue(Q, x));
printf("%d\n",outQueue(Q, x));
//测试队空入队
printf("%d\n",outQueue(Q, x));
return 0;
}
链队:
#include <stdio.h>
#include <stdlib.h>
#define maxsize 5
//队结点
typedef struct Node
{
int data;
struct Node *next;
}Node,*DNode;
//指针队列
typedef struct Queue
{
DNode front;
DNode rear;
//==Node *front,*rear
}Queue,*DQueue;
//初始化
void initQueue(DQueue &Q)
{
Q=(DQueue)malloc(sizeof(Queue));
Q->front=Q->rear=NULL;
}
//判断队为空
int isEmpty(DQueue Q)
{
if(Q->front==Q->rear)
return 1;
return -1;
}
//入队
void inQueue(DQueue &Q,int x)
{
//理论上不存在队满,除非内存满了,所以不用判断队满
//申请队结点
DNode q;
q=(DNode)malloc(sizeof(Node));
q->next=NULL;
q->data=x;
//如果队空,则插入结点为队首结点
if(Q->rear==NULL)
Q->front=Q->rear=q;
else
{
//y队不为空,尾指针所指的结点的next连接上q,同时后移尾指针
Q->rear->next=q;
Q->rear=q;
}
}
//出队
int outQueue(DQueue &Q,int x)
{
//队空不能出队,两个结点都不为空即可。就是有一个结点为空即队空
if(Q->front==NULL || Q->rear==NULL)
return -1;
DNode q;
//出队结点一定是front指向的结点,用一个结点q存储和释放出队结点
q=Q->front;
//判断是否仅有一个结点,仅有一个结点与多个结点处理起来不同
if(Q->front==Q->rear)
Q->front=Q->rear=NULL;
else
Q->front=Q->front->next;
x=q->data;
free(q);
return x;
}
int main()
{
DQueue Q;
int x;
initQueue(Q);
printf("%d\n",isEmpty(Q));
inQueue(Q, 11);
inQueue(Q, 4);
inQueue(Q, 7);
inQueue(Q, 9);
x=outQueue(Q, x);
printf("%d\n",x);
x=outQueue(Q, x);
printf("%d\n",x);
x=outQueue(Q, x);
printf("%d\n",x);
x=outQueue(Q, x);
printf("%d\n",x);
//队空出队测试
x=outQueue(Q, x);
printf("%d\n",x);
return 0;
}