实验指南
运行环境:
Dev c++
算法思想:
队列顺序存储用链表来表示,用front指针表示队首,用rear指针表示队尾,实现队列的几个基本的操作。
核心数据结构:
typedef int datatype;
typedef struct
{
datatype a[MAXSIZE];
int front;
int rear;
}sequence_queue;
程序主体框架:
//函数名:init 参数:sequence_queue * sq
void init(sequence_queue * sq)
{
//功能: 队列初始化
}
//函数名:empty 参数:sequence_queue * sq
bool empty(sequence_queue * sq)
{
//功能: 判断队列是否为空
}
//函数名:full 参数:sequence_queue * sq
bool full(sequence_queue * sq)
{
//功能: 判断队列是否为满
}
//函数名:display 参数:sequence_queue * sq
void display(sequence_queue * sq)
{
//功能: 打印队列
}
//函数名:dequeue 参数:sequence_queue * sq
datatype dequeue(sequence_queue * sq)
{
//功能: 出队
}
//函数名:insertqueue 参数:sequence_queue * sq, datatype x
void insertqueue(sequence_queue * sq, datatype x)
{
//功能: 入队
}
//函数名:clearqueue 参数:sequence_queue * sq
void clearqueue(sequence_queue * sq)
{
//功能: 清空队列
}
int main()
{
datatype x;
sequence_queue* sq = (sequence_queue*)malloc(sizeof(sequence_queue));
init(sq);
int n;
printf("请输入需要创建队列的个数:");
scanf("%d", &n);
for(int i = 1; i <= n; ++ i)
{
printf("请输入需要插入的值:");
scanf("%d", &x);
insertqueue(sq, x);
}
bool flag;
do
{
printf("是否进行出队操作(1: 是, 0: 否):");
scanf("%d", &flag);
if(flag)
{
x = dequeue(sq);
printf("出队的元素为: %d\n", x);
}
display(sq);
}while(flag);
do
{
printf("是否进行插入操作(1: 是, 0: 否):");
scanf("%d", &flag);
if(flag)
{
printf("请输入需要插入的值:");
scanf("%d", &x);
insertqueue(sq, x);
}
display(sq);
}while(flag);
clearqueue(sq);
return 0;
}
测试用例:
5
2
5
2
9
3
1
2
0
1
5
0
关键代码
#include<stdio.h>
#include <malloc.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct
{
datatype a[MAXSIZE];
int front;
int rear;
} sequence_queue;
void init (sequence_queue*sq)
{
for(int i=0;i<MAXSIZE;i++)
sq->a[i]=0;
sq->front=0;
sq->rear=0;
}
bool empty (sequence_queue*sq)
{
if(sq->front==sq->rear)
return true;
else
return false;
}
bool full (sequence_queue*sq)
{
if(sq->rear==MAXSIZE)
return true;
else
return false;
}
void display (sequence_queue*sq)
{
if(empty(sq))
return ;
else
{
for(int i=sq->front;i<sq->rear;i++)
printf("%d ",sq->a[i]);
}
}
datatype dequeue (sequence_queue*sq)
{
int x;
if(empty(sq))
return 0;
else
{
x=sq->a[sq->front];
sq->front++;
}
return x;
}
void insertqueue(sequence_queue*sq,datatype x)
{
if(full(sq))
return ;
sq->a[sq->rear]=x;
sq->rear++;
}
void cleanqueue(sequence_queue*sq)
{
printf("\n清空队列");
while(!empty(sq))
{
printf("%d ",dequeue(sq));
}
return;
}
int main()
{
datatype x;
sequence_queue*sq=(sequence_queue*)malloc(sizeof(sequence_queue));
init(sq);
int n;
printf("请输入需要创建队列的个数:");
scanf("%d",&n);
for(int i=0;i<n;++i)
{
printf("请输入需要插入的值:");
scanf("%d",&x);
insertqueue(sq,x);
}
bool flag;
do
{
printf("是否进行出队操作(1:是,0:否):");
scanf("%d",&flag);
if(flag&&empty(sq)==false)
{
x = dequeue(sq);
printf("出队的元素为:%d\n",x);
}
if(empty(sq))
{
printf("队列为空");
break;
}
display(sq);
}while(flag);
cleanqueue(sq);
return 0;
}
运行结果
实验总结
(1)在出队时,主程序不管队列中是否有元素,都会返回数组中原有的值。改进方法是在输出要出队元素前先判断队列是否为空,如果为空则显示队列中没有元素,反之则出队。
(2)在插入元素时,如果用户所要插入的元素个数大于给定的数组元素,则超过数组大小的元素数据会丢失。改进方法是当用户输入要创建的队列元素个数时,对其大小进行判断,如果不符合,则让用户重新输入所要创建的队列的元素个数。