循环队列的实现

来源:互联网 发布:域名管理系统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

运行结果:

这里写图片描述
这里写图片描述