C++ 实现有限容量队列:动态数组存储,异常处理
C++ 实现有限容量队列:动态数组存储,异常处理
本文介绍使用 C++ 实现一个有限容量队列,并使用动态数组存储队列元素。代码中包含队列满异常和队列空异常的处理,以及测试代码。
代码:
#include <iostream>
using namespace std;
#define OK 0
typedef int QElmeType;
typedef int Statue;
#define MAXQSIZE 6
typedef struct {
QElmeType* base; //基地址,动态分配存储空间
int front; //头指针
int rear; //尾指针
}SqQueue;
//初始化队列
Statue InitQuene(SqQueue& Q) {
Q.base = new QElmeType[MAXQSIZE];
//动态数组,为队列分配一个最大容量为MAXQSIZE的数组空间
if (Q.base == NULL) {
exit(OVERFLOW);
} //判断空间是否分配成功
Q.front = 0;
Q.rear = 0;
return OK;
}
//入队操作(循环队列)
Statue EnQueue(SqQueue& Q,int e) {
if ((Q.rear + 1) % MAXQSIZE == Q.front) {
throw -1;
} //判断是否为 队满
Q.base[Q.rear] = e; //新元素插入队尾
Q.rear = (Q.rear + 1) % MAXQSIZE; //队尾指针向上移动
return 0;
}
//出队算法(循环队列)
Statue DeQueue(SqQueue& Q) {
if (Q.front == Q.rear) {
throw 'deserse ERROR';
}
Q.front = (Q.front + 1) % MAXQSIZE; //队头指针向上移动
return 0;
}
void fun_EnQueue() { //当队列满时,添加元素,抛出一个队列满异常
SqQueue Q;
InitQuene(Q);
int i;
for (i = 0;i < 6;i++) {
EnQueue(Q, i);
}
for (i = 0;i < MAXQSIZE;i++) {
cout << Q.base[i] << endl;
}
}
/*当队列 满 时, 添加 元素, 就抛出一个 队列满异常;
当队列 空 时, 取出 元素, 就抛出一个 队列空异常。*/
void main()
{
SqQueue Q;
InitQuene(Q);
fun_EnQueue();
int e = 7;
try {
EnQueue(Q, e);
}
catch (...) { //捕获所有异常
cout << '队列满异常' << endl;
}
try {
DeQueue(Q);
} catch (...) {
cout << '队列空异常' << endl;
}
cout << 'Hello World!' << endl;
}
代码解释:
- 队列定义:
SqQueue结构体定义了队列的基本属性:base指向动态分配的数组空间,front和rear指向队头和队尾位置。
- 初始化队列:
InitQuene函数动态分配一个大小为MAXQSIZE的数组空间,并将队头和队尾指针初始化为 0。
- 入队操作:
EnQueue函数判断队列是否已满,如果满则抛出异常-1;否则将新元素插入队尾,并将队尾指针后移。
- 出队操作:
DeQueue函数判断队列是否为空,如果空则抛出异常'deserse ERROR';否则将队头指针后移,实现出队操作。
- 测试代码:
- 测试代码演示了入队和出队操作,并分别在队列满和队列空时尝试入队和出队操作,以测试异常处理机制。
注意:
- 代码中使用
catch(...)捕获所有异常,这在实际应用中可能并不安全,建议根据具体情况捕获特定类型的异常。 - 出队操作中,没有返回出队元素,而是直接将队头指针后移。
改进建议:
- 可以添加一个函数
IsEmpty来判断队列是否为空。 - 可以添加一个函数
IsFull来判断队列是否已满。 - 可以考虑将
MAXQSIZE改为可变参数,使其更灵活。
希望以上内容能帮助您理解有限容量队列的实现原理以及如何使用 C++ 实现它。', 'content_json': {'title': 'C++ 实现有限容量队列:动态数组存储,异常处理', 'description': '本文介绍使用 C++ 实现一个有限容量队列,并使用动态数组存储队列元素。代码中包含队列满异常和队列空异常的处理,以及测试代码。', 'keywords': 'C++, 队列, 循环队列, 动态数组, 异常处理, 队列满异常, 队列空异常', 'content': '## C++ 实现有限容量队列:动态数组存储,异常处理
本文介绍使用 C++ 实现一个有限容量队列,并使用动态数组存储队列元素。代码中包含队列满异常和队列空异常的处理,以及测试代码。
代码:
#include <iostream>
using namespace std;
#define OK 0
typedef int QElmeType;
typedef int Statue;
#define MAXQSIZE 6
typedef struct {
QElmeType* base; //基地址,动态分配存储空间
int front; //头指针
int rear; //尾指针
}SqQueue;
//初始化队列
Statue InitQuene(SqQueue& Q) {
Q.base = new QElmeType[MAXQSIZE];
//动态数组,为队列分配一个最大容量为MAXQSIZE的数组空间
if (Q.base == NULL) {
exit(OVERFLOW);
} //判断空间是否分配成功
Q.front = 0;
Q.rear = 0;
return OK;
}
//入队操作(循环队列)
Statue EnQueue(SqQueue& Q,int e) {
if ((Q.rear + 1) % MAXQSIZE == Q.front) {
throw -1;
} //判断是否为 队满
Q.base[Q.rear] = e; //新元素插入队尾
Q.rear = (Q.rear + 1) % MAXQSIZE; //队尾指针向上移动
return 0;
}
//出队算法(循环队列)
Statue DeQueue(SqQueue& Q) {
if (Q.front == Q.rear) {
throw 'deserse ERROR';
}
Q.front = (Q.front + 1) % MAXQSIZE; //队头指针向上移动
return 0;
}
void fun_EnQueue() { //当队列满时,添加元素,抛出一个队列满异常
SqQueue Q;
InitQuene(Q);
int i;
for (i = 0;i < 6;i++) {
EnQueue(Q, i);
}
for (i = 0;i < MAXQSIZE;i++) {
cout << Q.base[i] << endl;
}
}
/*当队列 满 时, 添加 元素, 就抛出一个 队列满异常;
当队列 空 时, 取出 元素, 就抛出一个 队列空异常。*/
void main()
{
SqQueue Q;
InitQuene(Q);
fun_EnQueue();
int e = 7;
try {
EnQueue(Q, e);
}
catch (...) { //捕获所有异常
cout << '队列满异常' << endl;
}
try {
DeQueue(Q);
} catch (...) {
cout << '队列空异常' << endl;
}
cout << 'Hello World!' << endl;
}
代码解释:
- 队列定义:
SqQueue结构体定义了队列的基本属性:base指向动态分配的数组空间,front和rear指向队头和队尾位置。
- 初始化队列:
InitQuene函数动态分配一个大小为MAXQSIZE的数组空间,并将队头和队尾指针初始化为 0。
- 入队操作:
EnQueue函数判断队列是否已满,如果满则抛出异常-1;否则将新元素插入队尾,并将队尾指针后移。
- 出队操作:
DeQueue函数判断队列是否为空,如果空则抛出异常'deserse ERROR';否则将队头指针后移,实现出队操作。
- 测试代码:
- 测试代码演示了入队和出队操作,并分别在队列满和队列空时尝试入队和出队操作,以测试异常处理机制。
注意:
- 代码中使用
catch(...)捕获所有异常,这在实际应用中可能并不安全,建议根据具体情况捕获特定类型的异常。 - 出队操作中,没有返回出队元素,而是直接将队头指针后移。
改进建议:
- 可以添加一个函数
IsEmpty来判断队列是否为空。 - 可以添加一个函数
IsFull来判断队列是否已满。 - 可以考虑将
MAXQSIZE改为可变参数,使其更灵活。
希望以上内容能帮助您理解有限容量队列的实现原理以及如何使用 C++ 实现它。
原文地址: https://www.cveoy.top/t/topic/nBkd 著作权归作者所有。请勿转载和采集!