当前位置: 首页 > article >正文

9.27 C++模板

模板实现顺序表、栈、队列

#include <iostream>


template <typename T>
class SeqList {
private:
    T* data;
    int size;
    int capacity;

public:
    SeqList(int capacity = 10)
        : size(0), capacity(capacity), data(new T[capacity]) {}

    ~SeqList() { delete[] _data; }

    void PushBack(const T& value) {
        if (size >= capacity) {
            Expand();
        }
        data[size++] = value;
    }

    void PopBack() {
        if (size > 0) {
            --size;
        }
    }

    T& operator[](int index) {
        
        return data[index];
    }

    const T& operator[](int index) const {
        return data[index];
    }

    int Size() const { return size; }

    bool Empty() const { return size == 0; }

private:
    void Expand() {
        capacity *= 2;
        T* newData = new T[capacity];
        for (int i = 0; i < size; ++i) {
            newData[i] = data[i];
        }
        delete[] data;
        data = newData;
    }


};

int main() {
    SeqList<int> list;
    list.PushBack(1);
    list.PushBack(2);
    list.PushBack(3);

    for (int i = 0; i < list.Size(); ++i) {
        std::cout << list[i] << " ";
    }

    return 0;
}
#include <iostream>


template <typename T>
class Stack {

private:
    T* data;
    int size;
    int capacity;

public:
    Stack(int capacity = 10)
        : size(0), capacity(capacity), data(new T[capacity]) {}

    ~Stack() { delete[] data; }

    void push(const T& value) {
        if (size >= capacity) {
            expand();
        }
        data[size++] = value;
    }

    void Pop() {
        if (size > 0) {
            --size;
        }
    }

    T& Top() {
        return data[size - 1];
    }

    const T& Top() const {
        return data[size - 1];
    }

    int Size() const { return size; }

    bool empty() const { return size == 0; }

private:
    void expand() {
        capacity *= 2;
        T* newData = new T[capacity];
        for (int i = 0; i < size; ++i) {
            newData[i] = data[i];
        }
        delete[] data;
        data = newData;
    }


};

int main() {
    Stack<int> s;
    s.push(10);
    s.push(20);
    s.push(30);
    
    while (!s.empty()) {
        std::cout << s.Top() << " ";
        s.pop();
    }

    return 0;
}
#include <iostream>


template <typename T>
class Queue {
private:
    T* data;
    int front;
    int rear;
    int size;
    int capacity;

public:
    Queue(int capacity = 10)
        : front(0), rear(0), size(0), capacity(capacity), data(new T[capacity]) {}

    ~Queue() { delete[] data; }

    void push(const T& value) {
        if (size >= capacity) {
            expand();
        }
        data[rear] = value;
        rear = (rear + 1) % capacity;
        ++size;
    }

    void pop() {
        if (size > 0) {
            front = (front + 1) % capacity;
            --size;
        }
    }

    T& Front() {
        return data[front];
    }

    const T& Front() const {
        return data[front];
    }

    int Size() const { return size; }

    bool empty() const { return size == 0; }

private:
    void expand() {
        T* newData = new T[capacity * 2];
        for (int i = 0; i < size; ++i) {
            newData[i] = data[(front + i) % capacity];
        }
        capacity *= 2;
        front = 0;
        rear = size;
        delete[] data;
        data = newData;
    }


};

int main() {
    Queue<int> q;
    q.push(1);
    q.push(2);
    q.push(3);

    while (!q.empty()) {
        std::cout << q.Front() << " ";
        q.pop();
    }

    return 0;
}


http://www.kler.cn/news/323126.html

相关文章:

  • Spring Boot 进阶-Spring Boot 开发第一个Web接口
  • 监控易监测对象及指标之:全面监控Oracle ODBC数据库
  • 汽车传感器的针脚数量因传感器类型和应用而异。
  • 图论系列(dfs)9/24
  • 解决你的IDE在使用的时候测试单元@Test在创建Scanner对象是键盘键入不了的问题;
  • jupyter快捷键
  • 猎板PCB大讲堂:PCB谐振效应及其对设计的影响
  • 探索高效中文分词:elasticsearch-analysis-hanlp 插件深度解析
  • Spring Cloud Alibaba-(4)Sentinel【流控和降级】
  • 每日一题|2516. 每种字符至少取 K 个|双指针、最长子串、字典
  • WebRTC中的维纳滤波器实现详解:基于决策导向的SNR估计
  • Ubuntu一些文件及问题研究分析
  • LabVIEW提高开发效率技巧----使用状态机架构
  • 华为云技术深度解析:Flexus X实例与GitLab的云端协作实践
  • pgsql
  • uniapp view增加删除线
  • 二维数组的创建和初始化
  • 插入排序(insertion sort)
  • self-supervised, weakly supervised, and supervised respectively区别
  • Django中媒体文件的配置
  • UnityHub下载任意版本的Unity包
  • C++ STL初阶(14): map和set
  • C#:动态为Object对象添加新属性的方法
  • Linux 命令 | 每日一学,文本处理三剑客之grep命令实践
  • ssh连接GitHub自定义密钥文件名
  • 【C++前缀和】2731. 移动机器人|1922
  • PHP foo()和@foo()之间有什么区别
  • GAMES101(17~18节,物理材质模型)
  • [go] 迭代器模式
  • 新手答疑 | 零基础该怎么学习嵌入式?嵌入式Linux学习路线是什么?嵌入式开发板推荐?