I come, I see, I conquer

                    —Gaius Julius Caesar

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

 

/*******************************************************************************
/* <PRE>
/* 版权所有    : -
/* 模块名      : 栈和队列
/* 文件名      : cqueue.cpp
/* 功能描述    : 循环队列的顺序存储表示与实现 
/* 作者        : <xxx>
/* 版本        : 1.0
/* -----------------------------------------------------------------------------
/* 备注        : -
/* -----------------------------------------------------------------------------
/* 修改记录    :
/* 日 期        版本     修改人        修改内容
/* 2011/01/01   1.0      <xxx>         创建
/* </PRE>
******************************************************************************
*/
#include 
<stdio.h>
#include 
<stdlib.h>

/******************************************************************************
/* 数据类型和常量定义
/*****************************************************************************
*/
#define OK           1
#define ERROR        0
#define OVERFLOW    -2

typedef 
int Status;
typedef 
int ElemType;
typedef 
int QElemType;

/******************************************************************************
/* 数据结构声明
/*****************************************************************************
*/
/* 循环队列 - 队列的顺序存储结构 */
#define MAXQSIZE 3   /* 最大队列长度 */

typedef 
struct {
    QElemType 
*base/* 初始化的动态分配存储空间 */
    
int front;       /* 头指针,若队列不空,指向队列头元素 */
    
int rear;        /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
}SqQueue;

/*******************************************************************************
/* <FUNC>
/* 函数名   : InitQueue
/* 功能     : 构造空队列
/* 参数     : -
/* 返回值   : -
/* 备注     : 构造一个空队列Q
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status InitQueue(SqQueue 
&Q) {
    Q.
base = (ElemType *)malloc(MAXQSIZE * sizeof(ElemType));
    
if (!Q.base) exit(OVERFLOW);
    Q.front 
= Q.rear = 0;
    
return OK;
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : QueueLength
/* 功能     : 求队列长度
/* 参数     : -
/* 返回值   : -
/* 备注     : 返回Q的元素个数, 即队列的长度
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
int QueueLength(SqQueue &Q) {
    
return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : EnQueue
/* 功能     : 入队列
/* 参数     : -
/* 返回值   : -
/* 备注     : 插入元素e为Q的新的队尾元素
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status EnQueue(SqQueue 
&Q, QElemType e) {
    
if ((Q.rear + 1% MAXQSIZE == Q.front) return ERROR; //队列满
    Q.base[Q.rear] = e;
    Q.rear 
= (Q.rear + 1% MAXQSIZE;
    
return OK;
}

/*******************************************************************************
/* <FUNC>
/* 函数名   : DeQueue
/* 功能     : 出队列
/* 参数     : -
/* 返回值   : -
/* 备注     : 若队列不空, 则删除Q的队头元素, 用e返回其值, 并返回OK; 否则返回ERROR
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
Status DeQueue(SqQueue 
&Q, QElemType &e) {
    
if (Q.front == Q.rear) return ERROR;
    e 
= Q.base[Q.front];
    Q.front 
= (Q.front + 1% MAXQSIZE;
    
return OK;
}


/*******************************************************************************
/* <FUNC>
/* 函数名   : main
/* 功能     : 测试函数
/* 参数     : -
/* 返回值   : -
/* 备注     : -
/* 作者     : <xxx>
/* </FUNC>
******************************************************************************
*/
void main()
{
    SqQueue Q;  QElemType e;
    InitQueue(Q);
    
if(OK == EnQueue(Q, 10)) printf("enqueue ok!\n");
    
if(OK == EnQueue(Q, 20)) printf("enqueue ok!\n");
    
if(OK == EnQueue(Q, 30)) printf("enqueue ok!\n");
    
if(OK == DeQueue(Q, e)) printf("%d\n", e);
    
if(OK == DeQueue(Q, e)) printf("%d\n", e);
    
if(OK == DeQueue(Q, e)) printf("%d\n", e);
    
if(OK == DeQueue(Q, e)) printf("%d\n", e);
}

 

posted on 2011-04-05 15:19  jcsu  阅读(591)  评论(0编辑  收藏  举报