循环队列的实现
来源:互联网 发布:域名管理系统dns 编辑:程序博客网 时间:2024/06/02 18:42
主要代码:
/**************************************************** @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;////////////////////////////////////////////循环队列的基本操作 //构造一个空队列QStatus 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
运行结果:
阅读全文
0 0
- 队列----循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 输出一个某种编码的字符串
- 2017 乌鲁木齐赛区网络赛 Coconut(【模拟题目】)
- 209. Minimum Size Subarray Sum解题报告
- Noip 2016 蚯蚓
- a2dp
- 循环队列的实现
- Codeforces Round #311 (Div. 2) D. Vitaly and Cycle 图论 二分图
- [luogu3387]缩点+DAGdp板子
- Allegro——原理图软件Design Entry CIS问题解决
- MySql常用函数总结
- 各类消息队列(MQ)选择对比
- python可视化——使用pygal模拟掷骰子
- 打印排序结果
- 山世光老师的FaceAlignment特征检测部分