一、实验内容
1.采用顺序存储实现循环队列的初始化、入队、出队操作。
2.采用链式存储实现队列的初始化、入队、出队操作。
3.编写一个程序,使用两个链队q1和q2,用来分别存储由计算机随机产生的20个100以内的奇数和偶数,然后每行输出q1和q2的一个值,即奇数和偶数配对输出,直到任一队列为空为止。
顺序存储
代码实现:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100 //最大队列长度
typedef int ElemType;
typedef struct{
ElemType data[MAXSIZE];
int front,rear; //队头、队尾
}SqQueue;
int InitQueue(SqQueue **Q)//初始化循环队列
{
*Q=(SqQueue*)malloc(sizeof(SqQueue));
if(!(*Q))return 0;
(*Q)->front=(*Q)->rear=0;
return 1;
}
int QueueEmpty(SqQueue Q)//判断队空
{
return Q.front==Q.rear;
}
int QueueFull(SqQueue Q)//判断队满
{
return (Q.rear+1)%MAXSIZE==Q.front;
}
int EnQueue(SqQueue *Q, ElemType e)//入队操作
{
if(QueueFull(*Q))return 0;
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return 1;
}
int DeQueue (SqQueue *Q, ElemType *e)//出队操作
{
if(QueueEmpty(*Q))return 0;
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return 1;
}
int main()
{
SqQueue *Q;int i;
InitQueue(&Q);
EnQueue(Q,99);
EnQueue(Q,6);
EnQueue(Q,74);
EnQueue(Q,56);
EnQueue(Q,100);
while(!QueueEmpty(*Q)){
DeQueue(Q,&i);
printf("%d ",i);
}
printf("\n");
return 0;
}
程序演示:
链式存储:
代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAXSIZE 100 //最大队列长度
typedef int ElemType;
typedef struct QNode
{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int InitQueue(LinkQueue *Q)//将Q初始化为一个空的链队列
{
Q->front=Q->rear=(QNode*)malloc(sizeof(QNode));
if(!Q->front)return 0;
Q->front->next=NULL;
return 1;
}
int QueueEmpty(LinkQueue Q)//判断队空
{
return Q.front==Q.rear;
}
int EnQueue(LinkQueue *Q, ElemType e)//入队操作
{
QNode *p=(QNode*)malloc(sizeof(QNode));
if(!p)return 0;
p->data=e;
Q->rear->next=p;
Q->rear=p;
return 1;
}
int DeQueue(LinkQueue *Q,ElemType *e)//出队操作
{
QNode *p;
if(QueueEmpty(*Q))return 0;
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
if(Q->rear==p)Q->rear=Q->front;
free(p);
return 1;
}
int main()
{
LinkQueue q1,q2;
int i=0,j=0,num;
InitQueue(&q1);
InitQueue(&q2);
srand((unsigned)time(NULL));
while(i<20||j<20){
num=rand()%100+1;
if(num%2==0&&i<20){
EnQueue(&q1,num);
i++;
}
if(num%2!=0&&j<20){
EnQueue(&q2,num);
j++;
}
}
while(!QueueEmpty(q1)&&!QueueEmpty(q2)){
DeQueue(&q1,&i);
DeQueue(&q2,&j);
printf("%3d%3d\n",i,j);
}
return 0;
}
程序演示:
分析:队列程序需要判断队空,在顺序存储中用结构体专门定义两个个数据域存放队头和队尾元素的下标,链式存储中则直接定义队头队尾指针.