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 'full ERROR'; // 抛出队列满异常
} // 判断是否为 队满
Q.base[Q.rear] = e; // 新元素插入队尾
Q.rear = (Q.rear + 1) % MAXQSIZE; // 队尾指针向上移动
return 0;
}
// 出队算法(循环队列)
Statue DeQueue(SqQueue& Q, int& e) {
if (Q.front == Q.rear) {
throw 'deserse ERROR'; // 抛出队列空异常
}
e = Q.base[Q.front]; // 保存队头元素
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 (const char* msg) { // 捕获 const char* 类型的异常
cout << msg << endl;
}
cout << "Hello World!\n";
}
代码分析:
-
队列结构
SqQueue结构体包含三个成员变量:base指向动态分配的数组,front为队头指针,rear为队尾指针。
-
初始化队列
InitQuene函数动态分配一个大小为MAXQSIZE的数组,并将front和rear初始化为 0。
-
入队操作
EnQueue函数在入队前判断队列是否已满,如果队列已满,则抛出异常'full ERROR'。
-
出队操作
DeQueue函数在出队前判断队列是否为空,如果队列为空,则抛出异常'deserse ERROR'。
-
异常处理
- 主函数中使用
try...catch语句捕获EnQueue函数抛出的异常,并输出异常信息。
- 主函数中使用
说明:
- 代码中使用
const char*类型的异常,因为'full ERROR'和'deserse ERROR'是字符串常量。 - 可以在
EnQueue和DeQueue函数中定义更具体的异常类,以提供更详细的异常信息。 - 由于异常处理机制,在发生异常时,程序会终止执行,因此需要根据实际情况进行错误处理。
测试:
这段代码在执行 EnQueue(Q, e) 时,由于队列已满,会抛出 'full ERROR' 异常,程序会输出 "full ERROR" 并正常结束。
总结:
本文演示了使用 C++ 实现一个有限队列,并使用动态数组存储队列元素。同时,本文还演示了如何在队列满或队列空时抛出自定义异常,以及如何捕获这些异常。这使得程序能够更加健壮地处理异常情况,提高代码的可靠性。
原文地址: https://www.cveoy.top/t/topic/nBjV 著作权归作者所有。请勿转载和采集!