/*******************************************************************************
/* <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);
}
/* <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);
}