主要代码:
/****************************************************
@Title: 数据结构实验
@Name: <实验3-4> <循环队列>
@Object:
[实验目的] 实现循环队列的基本操作,并进行测试。
[实验提示]
1. 在文件 sqqueue.h 中完成 SqQueue 的类型定义
2. 实现 SqQueue 的基本操作
注意:取队头元素、入队列和出队列的前提
@Files:
dsp0304.cpp [*]
测试循环队列的主程序
sqqueue.h [*]
循环队列的实现
@Usage:
请查看"TO-DO列表",根据要求完成代码
@Copyright: BTC 2004, Zhuang Bo
@Author: Zhuang Bo
@Date: 2004
@Description:
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "sqqueue.h"
//初始化系统
void Initialize(SqQueue &q);
//显示操作菜单
void ShowMenu();
//读取用户命令
int GetCommand();
//执行用户命令
int DoCommand(int cmd, SqQueue &q);
//结束执行
void Finalize(SqQueue &q);
////////////////////////////////////////////
//主程序
int main()
{
SqQueue q; //循环队列
int cmd; //用户命令
//系统初始化
Initialize(q);
//显示操作菜单
ShowMenu();
//进入主循环
while(1) {
//读取用户命令(0 表示退出)
cmd = GetCommand();
//执行命令cmd操作队列q
DoCommand(cmd,q);
//退出命令
if( cmd == 0 ) break; // 退出
}
/* NOTE: 以上主循环还可以简化成
* while(DoCommand(GetCommand(),q));
*/
//结束前执行的操作
Finalize(q);
system("pause"); //暂停
}
////////////////////////////////////////////
//函数的定义
//初始化系统
void Initialize(SqQueue &q)
{
InitQueue(q); //初始化队列
}
//显示操作菜单
void ShowMenu()
{
printf("1)EnQueue 2)DeQueue 3)Clear 4)Empty"
" 5)Length 6)Head 7)View 9)Menu 0)Quit\n");
}
//读取用户命令
int GetCommand()
{
int cmd=-1;
printf(">");
if(scanf("%d", &cmd)<1)
fflush(stdin); //处理输入错误
return cmd;
}
//结束执行
void Finalize(SqQueue &q)
{
DestroyQueue(q); //销毁队列
printf("程序已经结束\n");
}
//执行用户命令cmd, 测试队列的各种操作
// 执行结束后返回命令(便于书写主循环)
int DoCommand(int cmd, SqQueue &q)
{
int e;
switch(cmd) {
case 1: //EnQueue......................
printf("输入入队列的数据:");
if(scanf("%d",&e)<1) {
printf("输入错误\n");
fflush(stdin);
} else if(EnQueue(q,e)==OK)
printf("入队列成功\n" );
else
printf("入队列失败\n");
break;
case 2: //DeQueue......................
if( DeQueue(q,e)==OK )
printf("%d 出队列\n", e);
else
printf("出队列失败\n");
break;
case 3: //Clear........................
if(ClearQueue(q)==OK)
printf("队列已清空\n");
else
printf("清空队列失败\n");
break;
case 4: //Empty........................
if(QueueEmpty(q)==TRUE)
printf("队列空\n" );
else
printf("队列不空\n");
break;
case 5: //Length.......................
printf("队列长度: %d\n", QueueLength(q));
break;
case 6: //Head.........................
if(GetHead(q,e)==OK)
printf("队头元素: %d\n", e);
else
printf("取队头元素失败\n");
break;
case 7: //View.........................
/* TODO (#9#): 实现SqQueue类型后使用QueueView()函数 */
QueueView(q);
break;
case 9: //Menu.........................
ShowMenu();
case 0: //Quit.........................
//后面 return cmd; 返回0可以结束主循环
break;
default:
printf("命令错误\n");
}
return cmd; //返回最近执行的命令
}
/*
Name: 循环队列
Copyright: BTC 2004
Author: Zhuang Bo
Date: 2004
Description:
[Include]
ds.h
[Constants]
MAXQSIZE
[Types]
ElemType
SqQueue
[Functions]
InitQueue(&Q)
DestroyQueue(&Q)
ClearQueue(&Q)
QueueEmpty(Q)
QueueLength(Q)
GetHead(Q,&e)
EnQueue(&Q,e)
DeQueue(&Q,&e)
[For Debug]
PrintElem(ElemType e)
QueueView(Q)
*/
#ifndef SQQUEUE_H_INCLUDED
#define SQQUEUE_H_INCLUDED /* 防止重复包含 */
//////////////////////////////////////////
//包含头文件
#include <stdlib.h>
#include "ds.h" // OK, Status 等定义
//数据元素的类型(缺省使用int型)
#ifndef ElemType
#define ElemType int
#define USE_DEFAULT_ELEMTYPE /* 使用缺省类型的标志 */
#endif //ElemType
//////////////////////////////////////////
//循环队列的存储结构
#define MAXQSIZE 64 /* 循环队列的最大容量 */
typedef struct {
/* TODO (#1#): 这里完成循环队列的类型定义 */
ElemType *base;
int front;
int rear;
//....................................
} SqQueue;
//////////////////////////////////////////
//循环队列的基本操作
//构造一个空队列Q
Status InitQueue(SqQueue &Q)
{
/* TODO (#2#): 构造空队列 */
Q.base=(ElemType*)malloc(MAXQSIZE*sizeof(ElemType));
if(!Q.base){
exit(0);
}
Q.front=Q.rear=0;
return OK; //TODO: 替换这行代码,以下同
//....................................
}
//销毁队列Q
// 前提:队列Q已存在
Status DestroyQueue(SqQueue &Q)
{
/* TODO (#3#): 销毁队列 */
if(Q.base){
free(Q.base);
return OK;
}
else
return ERROR;
//....................................
}
//将队列Q清为空队列
// 前提:队列Q已存在
Status ClearQueue(SqQueue &Q)
{
/* TODO (#4#): 清空队列 */
if(Q.base){
Q.front=Q.rear;
return OK;
}
else
return ERROR;
//....................................
}
//若队列Q为空,则返回TRUE,否则FALSE
// 前提:队列Q已存在
Status QueueEmpty(SqQueue Q)
{
/* TODO (#5#): 判断队列是否为空 */
if(Q.rear==Q.front){
return TRUE;
}
return FALSE;
//....................................
}
//返回队列Q的元素个数,即队列长度
// 前提:队列Q已存在
int QueueLength(SqQueue Q)
{
/* TODO (#6#): 返回队列长度 */
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
//....................................
}
//取队列Q头元素用e返回
// 前提:队列Q存在且非空
Status GetHead(SqQueue Q, ElemType &e)
{
/* TODO (#7#): 取队头元素存入e */
if(Q.front==Q.rear){//队列为空
return ERROR;
}
e=Q.base[Q.front];
return OK;//返回操作状态(成功:OK,失败:ERROR)
//....................................
}
//插入元素e作为队列Q的新的队尾元素
// 前提:队列Q存在且未满
Status EnQueue(SqQueue &Q, ElemType e)
{
/* TODO (#8#): 元素e入队列 */
if((Q.rear+1)%MAXQSIZE==Q.front){
return ERROR;
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;//返回操作状态(成功:OK,失败:ERROR)
//....................................
}
//删除队列Q的队头元素,并用e返回
// 前提:队列Q存在且非空
Status DeQueue(SqQueue &Q, ElemType &e)
{
/* TODO (#9#): 出队列存入e */
if(Q.front==Q.rear){
return ERROR;
}
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK ;//返回操作状态(成功:OK,失败:ERROR)
//....................................
}
//////////////////////////////////////////
//TODO: 定义好 SqQueue 类型后使用 QueueView 函数
#include <stdio.h>
//查看队列状态(调试用)
void QueueView(SqQueue Q)
{
//extern void PrintElem(ElemType e);//打印数据用
int i=0;
if(Q.front<0||Q.front>=MAXQSIZE||Q.rear<0||Q.rear>=MAXQSIZE){
printf("队列未初始化\n");
return ;
}
printf("---Queue View---\n");
printf("front=%d , rear=%d\n", Q.front, Q.rear);
if(Q.rear>=Q.front) {
printf("..... ......\n");
for(i=Q.front; i<Q.rear; i++) {
printf("%5d\t", i);
printf("%d",Q.base[i]);
printf("\n");
}
if(i<MAXQSIZE) printf("..... ......\n");
} else {
for(i=0; i<Q.rear; i++) {
printf("%5d\t", i);
printf("%d",Q.base[i]);
printf("\n");
}
printf("..... ......\n");
for(i=Q.front; i<MAXQSIZE; i++) {
printf("%5d\t", i);
printf("%d",Q.base[i]);
printf("\n");
}
}
printf("--- view end ---\n");
}
//取消ElemType的默认定义,以免影响其它部分
#ifdef USE_DEFAULT_ELEMTYPE
#undef ElemType
#undef USE_EFAULT_ELEMTYPE
#endif
#endif //SQQUEUE_H_INCLUDED
运行结果: