数据结构实验:循环顺序队列操作
- 实验题目:循环顺序队列操作
- 需求分析:
本演示程序在TC2.0环境下编写调试,完成队列初始化,入队,出队,判断队列是否为空,取队头元素,遍历队列等操作。
首先要根据键盘输入的数据建立一个循环顺序队列,其次根据屏幕的菜单选择,可以进行数据的入队或出队操作,并在入队或出队后,再输出队列;最后在屏幕菜单中选择0,即可结束程序的运行。
- 初始化队列
- 建立顺序队列依次输入5 1,2,3,4,5 ,建立5个元素的循环顺序队列
- 入队操作中输入20 将20入队
- 出队操作 将队头元素1出队
- 取队头元素,此时队头元素为2
- 遍历队列 输出队列的队首元素 队尾元素位置 队列长度 队列数据
- 程序所能达到的功能。完成循环顺序队列的生成、入队、出队、遍历、取队头元素、判断队列是否为空的操作。
- 测试数据。
- 概要设计
- 主函数main()
- 初始化循环顺序队列initQueue()
- 建立循环顺序队列函数 Setsqqueue()
- 入队函数 append()
- 出队函数Delete()
- 遍历队列函数Display()
- 取队头元素函数gethead()
- 为了实现上述程序功能,需要定义循环顺序队列的数据结构。
- 本程序包含7个函数
- 详细设计
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXNUM 10
#define Elemtype int
#define TRUE 1
#define FALSE 0
typedef struct{
Elemtype queue[MAXNUM];
int front;
int rear;
}sqqueue;
int initQueue(sqqueue *q)
{
if(!q) return FALSE;
q->front=0;
q->rear=0;
return TRUE;
}
int append(sqqueue *q,Elemtype x){
if((q->rear+1)%MAXNUM==q->front){
printf("\n队列满!");
return FALSE;
}
q->queue[q->rear]=x;
q->rear=(q->rear+1)%MAXNUM;
return TRUE;
}
int Delete(sqqueue * q) {
Elemtype x;
if(q->front==q->rear)
{ printf("队列空!\n");
return 0;
}
x=q->queue[q->front];
q->front=(q->front+1)%MAXNUM;
printf("\n队头元素%d出队!\n",x);
return TRUE;
}
int Empty(sqqueue * q) {
if(q->front==q->rear) {
return TRUE;
}
return FALSE;
}
int gethead(sqqueue * q) {
Elemtype x;
if(q->front==q->rear) {
printf("队列空!\n");return 0; }
x=(q->queue[q->front+1]);
printf("队头元素为:%d\n",x);
return x;
}
void display(sqqueue * q) {
int s;
s=q->front;
if(q->front==q->rear)
printf("队列空!\n");
else {
printf("\n顺序队列依次为:");
while(s!=q->rear) {
printf("%d<-",q->queue[s]);
s=(s+1)%MAXNUM;
}
printf("\n");
printf("顺序队列的队尾元素所在位置:rear= %d\n",q->rear);
printf("顺序队列的队头元素所在位置:front= %d\n",q->front);
printf("顺序队列的长度为:%d\n",(q->rear-q->front+MAXNUM)%MAXNUM);
}
}
void Setsqqueue(sqqueue *q) {
int n,i,m;
printf("\n请输入顺序队列的长度:");
scanf("%d",&n);
printf("\n请依次输入入顺序队列的元素值:\n");
for(i=0;i<n;i++){
scanf("%d",&m);
append(q,m);
}
}
int main() {
sqqueue *head;
int x,select;
head=(sqqueue*)malloc(sizeof(sqqueue));
printf("\n第一次使用请初始化!\n");
do {
printf("============主菜单============\n");
printf("1 初始化\n");
printf("2 建立顺序队列\n");
printf("3 入队\n");
printf("4 出队\n");
printf("5 判断队列是否为空\n");
printf("6 取队头元素\n");
printf("7 遍历队列\n");
printf("0 结束程序运行\n");
printf("===============================\n");
printf("\n请选择操作(1--7):\n");
scanf("%d",&select);
switch(select) {
case 1: {
initQueue(head);
printf("已经初始化顺序队列!\n"); break; }
case 2: {
Setsqqueue(head);
printf("\n已经建立队列!\n"); display(head); break; }
case 3: {
printf("请输入队的值:\n"); scanf("%d",&x);
append(head,x);
display(head); break; }
case 4: {
Delete(head);
display(head);
break; }
case 5: {
if(Empty(head))
printf("队列空\n");
else
printf("队列非空\n");
break; }
case 6: {
gethead(head);
break; }
case 7: {
display(head);
break; }
case 0: exit(0);
}
}while(select<=7);
return 0;
}
- 调试分析
编译未发现错误
- 使用说明
程序名为未命名1.exe,运行环境为MS-DOS。程序执行后显示:
在"请输入你的选择(1,2,3,4,5,6,7,0)"后输入数字选择执行不同的功能。要求首先输入1初始化,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后队列的内容。
选择0:退出程序
选择1:显示"已初始化顺序队列!"
选择2:显示"请输入顺序队列的长度:","请依次输入入顺序队列的元素值:"要求分别输入要插入的元素的个数和元素的值。
选择3:显示"请输入队的值:",要求输入入队元素的值
选择4:显示"元素XX出队!",XX为队头元素
选择5:当队列不为空时显示"队列非空"
选择6:输出当前队头元素的值
选择7:输出整个队列的内容