循环队列的实现

主要代码:

/****************************************************
  @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

运行结果:

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值