c语言编程笔录

首页 >   > 笔记大全

笔记大全

在c于java项目中自定义TroopT泛型类达到方法

更新时间:2023-11-06

第一段:Troop类的设计

在C++或Java的项目中,使用泛型类可以使程序更加灵活和通用。我们要创建的Troop类,实现了一组类似队列的操作,可以用来存储和操作一组具有相同类型T的数据。该类的设计思路是允许用户添加元素、删除元素、获取队列中第一个或最后一个元素,查询队列长度等操作。

以下是Troop类的定义,我们使用C++实现:


template <typename T>
class Troop {
private:
    T* container; // 数据存储的容器
    int capacity; // 容器的容量
    int size; // 队列中元素的个数
    int head; // 队列头指针
    int tail; // 队列尾指针
public:
    Troop(int cap = 10); // 构造函数
    ~Troop(); // 析构函数
    bool isEmpty(); // 判断队列是否为空
    bool isFull(); // 判断队列是否已满
    bool enqueue(T date); // 在队列尾部添加元素
    bool dequeue(); // 在队列头部删除元素
    T front(); // 获取队列头元素的值
    T back(); // 获取队列尾元素的值
    int size(); // 返回队列中元素的个数
};

第二段:成员函数的实现

现在我们需要实现Troop类中的各个成员函数,让它们能够完成队列的各种操作。下面是对成员函数的一些具体说明:

  • 在enqueue函数中,如果队列没有满,则在队列尾部添加元素date,并返回true。如果队列已满,则返回false。
  • 在dequeue函数中,如果队列不为空,则删除队列头元素,并返回true。如果队列为空,则返回false。
  • 在front和back函数中,如果队列不为空,则返回队列头和队列尾的元素。如果队列为空,则返回一个默认值。
  • 在size函数中,返回队列中元素的个数。

让我们来看一下如何实现这些成员函数,以下是enqueue函数的代码实现:


template <typename T>
bool Troop<T>::enqueue(T date) {
    if (this->isFull()) { // 队列已满
        return false;
    }
    container[tail++] = date;
    size++;
    return true;
}

使用isFull函数来判断队列是否已满。如果队列未满,则将元素添加到队列的末尾,同时更新队列长度和尾指针。以下是dequeue函数的代码实现:


template <typename T>
bool Troop<T>::dequeue() {
    if (this->isEmpty()) { // 队列为空
        return false;
    }
    head++;
    size--;
    return true;
}

使用isEmpty函数来判断队列是否为空。如果队列非空,则将头指针向右移动一位,同时更新队列长度。以下是front和back函数的代码实现:


template <typename T>
T Troop<T>::front() {
    if (this->isEmpty()) {
        return T(); // 返回默认值
    }
    return container[head];
}

template <typename T>
T Troop<T>::back() {
    if (this->isEmpty()) {
        return T(); // 返回默认值
    }
    return container[tail - 1];
}

如果队列为空,则返回一个默认值,否则返回队列头和尾的元素。最后是size函数的代码实现:


template <typename T>
int Troop<T>::size() {
    return size;
}

该函数只需要返回队列中元素的个数。

第三段:构造函数和析构函数的实现

现在我们需要实现Troop类的构造函数和析构函数。

对于构造函数,我们需要设置容器的初值,并为队列的各个指针和成员变量赋初值。以下是构造函数的代码实现:


template <typename T>
Troop<T>::Troop(int cap) {
    capacity = cap;
    container = new T[capacity];
    size = 0;
    head = 0;
    tail = 0;
}

在析构函数中,我们需要释放容器的内存。以下是析构函数的代码实现:


template <typename T>
Troop<T>::~Troop() {
    delete[] container;
    container = nullptr;
}

第四段:使用Troop类的示例

现在我们已经定义了一个名为Troop的泛型队列类,下面是一个示例程序,演示了如何在C++中使用Troop类存储和操作数字:


#include <iostream>
#include "Troop.h"
using namespace std;
int main() {
    Troop<int> troop(5);
    tropp.enqueue(1);
    troop.enqueue(2);
    troop.enqueue(3);
    cout << "队列长度:" << troop.size() << endl; // 输出:3
    
    troop.dequeue();
    cout << "队列头元素的值:" << troop.front() << endl; // 输出:2
    cout << "队列尾元素的值:" << troop.back() << endl; // 输出:3
    return 0;
}

以上代码演示了如何使用Troop类,存储和操作数字。首先创建了一个容量为5的Troop类型变量troop,并在其中添加了元素1,2,3。然后输出队列的长度。接着删除队列的头元素,输出队列头元素的值和队列尾元素的值。

在Java中使用Troop类的方式与上面的C++类似,只需要修改相应的语法和函数名称即可。