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";
}

代码分析:

  1. 队列结构

    • SqQueue 结构体包含三个成员变量:base 指向动态分配的数组,front 为队头指针,rear 为队尾指针。
  2. 初始化队列

    • InitQuene 函数动态分配一个大小为 MAXQSIZE 的数组,并将 frontrear 初始化为 0。
  3. 入队操作

    • EnQueue 函数在入队前判断队列是否已满,如果队列已满,则抛出异常 'full ERROR'
  4. 出队操作

    • DeQueue 函数在出队前判断队列是否为空,如果队列为空,则抛出异常 'deserse ERROR'
  5. 异常处理

    • 主函数中使用 try...catch 语句捕获 EnQueue 函数抛出的异常,并输出异常信息。

说明:

  • 代码中使用 const char* 类型的异常,因为 'full ERROR''deserse ERROR' 是字符串常量。
  • 可以在 EnQueueDeQueue 函数中定义更具体的异常类,以提供更详细的异常信息。
  • 由于异常处理机制,在发生异常时,程序会终止执行,因此需要根据实际情况进行错误处理。

测试:

这段代码在执行 EnQueue(Q, e) 时,由于队列已满,会抛出 'full ERROR' 异常,程序会输出 "full ERROR" 并正常结束。

总结:

本文演示了使用 C++ 实现一个有限队列,并使用动态数组存储队列元素。同时,本文还演示了如何在队列满或队列空时抛出自定义异常,以及如何捕获这些异常。这使得程序能够更加健壮地处理异常情况,提高代码的可靠性。


原文地址: https://www.cveoy.top/t/topic/nBjV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录