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

C++day7

一、思维导图

二、模板类实现myStack和myQueue

#include <iostream>

using namespace std;

template <typename T>
class MyStack {
private:
    T* arr;
    int capacity;
    int topIndex;

public:
    MyStack(int size);
    ~MyStack();
    void push(const T& value);
    void pop();
    T top() const;
    bool empty() const;
    size_t size() const;
};

template <typename T>
MyStack<T>::MyStack(int size) {
    capacity = size;
    arr = new T[capacity];
    topIndex = -1;
}

template <typename T>
MyStack<T>::~MyStack() {
    delete[] arr;
}

template <typename T>
void MyStack<T>::push(const T& value) {
    if (topIndex == capacity - 1) {
        cout << "栈已满,无法添加元素" << endl;
        return;
    }
    arr[++topIndex] = value;
}

template <typename T>
void MyStack<T>::pop() {
    if (topIndex == -1) {
        cout << "栈为空,无法弹出元素" << endl;
        return;
    }
    topIndex--;
}

template <typename T>
T MyStack<T>::top() const {
    if (topIndex == -1) {
        cout << "栈为空,无法获取顶部元素" << endl;
        return T(); // 返回默认构造的元素
    }
    return arr[topIndex];
}

template <typename T>
bool MyStack<T>::empty() const {
    return topIndex == -1;
}

template <typename T>
size_t MyStack<T>::size() const {
    return topIndex + 1;
}

int main() {
    MyStack<int> myStack1(5);
    myStack1.push(1);
    myStack1.push(2);
    myStack1.push(3);

    cout << "栈顶元素: " << myStack1.top() << endl;
    myStack1.pop();
    cout << "栈顶元素: " << myStack1.top() << endl;

    MyStack<string> myStack2(5);
    myStack2.push("A");
    myStack2.push("B");
    myStack2.push("C");

    cout << "栈顶元素: " << myStack2.top() <<endl;
    myStack2.pop();
    cout << "栈顶元素: " << myStack2.top() << endl;

    return 0;
}

#include <iostream>

using namespace std;

#ifndef MYQUEUE_H
#define MYQUEUE_H

template <typename T>
class myQueue
{
private:
    T *data;
    size_t frontIndex;
    size_t backIndex;
    size_t capacity;

public:
    myQueue();
    myQueue(size_t cap);
    myQueue(const myQueue& other);
    virtual ~myQueue();

    myQueue& operator=(const myQueue other);

    void expend();

    T& front();

    T& back();

    bool empty();

    size_t get_size();

    myQueue& push(T element);

    myQueue& pop();
};

#endif // MYQUEUE_H

template <typename T>
myQueue<T>::myQueue():frontIndex(0),backIndex(0),capacity(5) {
    data = new T [5];
}

template <typename T>
myQueue<T>::myQueue(size_t cap):frontIndex(0),backIndex(0) {
    data = new T[cap];
    capacity = cap;
}

template <typename T>
myQueue<T>::myQueue(const myQueue& other) {
    if(this != &other) {
        capacity = other.capacity;
        data = new T[capacity];
        frontIndex = other.frontIndex;
        backIndex = other.backIndex;
        copy(other.data, other.data + capacity, data);
    }
}

template <typename T>
myQueue<T>::~myQueue() {
    delete []data;
}

template <typename T>
myQueue<T>& myQueue<T>::operator=(const myQueue other) {
    if (this == &other) {
        return *this;
    }

    delete[] data;

    capacity = other.capacity;
    frontIndex = other.frontIndex;
    backIndex = other.backIndex;
    data = new T[capacity];
    copy(other.data, other.data + capacity, data);

    return *this;
}

template <typename T>
void myQueue<T>::expend() {
    size_t newCapacity = capacity * 2;
    T* newData = new T[newCapacity];
    copy(data, data + capacity, newData);
    delete[] data;
    data = newData;
    capacity = newCapacity;
}

template <typename T>
T& myQueue<T>::front() {
    return data[frontIndex];
}

template <typename T>
T& myQueue<T>::back() {
    return data[backIndex-1];
}

template <typename T>
bool myQueue<T>::empty() {
    return (frontIndex == backIndex);
}

template <typename T>
size_t myQueue<T>::get_size() {
    return (backIndex - frontIndex);
}

template <typename T>
myQueue<T>& myQueue<T>::push(T element) {
    if(capacity == (backIndex+1)) {
        this->expend();
    }
    this->data[backIndex] = element;
    this->backIndex++;
    return *this;
}

template <typename T>
myQueue<T>& myQueue<T>::pop() {
    if (empty()) {
        throw runtime_error("Queue is empty");
    }
    frontIndex++;
    return *this;
}


int main() {
    myQueue<int> myQueue1(5);
    myQueue1.push(1);
    myQueue1.push(2);
    myQueue1.push(3);

    cout << "队列首元素: " << myQueue1.front() << endl;
    myQueue1.pop();
    cout << "队列首元素: " << myQueue1.front() << endl;

    myQueue<string> myQueue2(5);
    myQueue2.push("A");
    myQueue2.push("B");
    myQueue2.push("C");

    cout << "队列首元素: " << myQueue2.front() <<endl;
    myQueue2.pop();
    cout << "队列首元素: " << myQueue2.front() << endl;

    return 0;
}


http://www.kler.cn/a/300273.html

相关文章:

  • 第23篇 基于ARM A9处理器用汇编语言实现中断<五>
  • Kotlin协程中withContext、async 和 launch 的区别
  • systemverilog中的force,release和assign
  • 代码中使用 Iterable<T> 作为方法参数的解释
  • Java虚拟机面试题:内存管理(中)
  • PyTorch使用教程(10)-torchinfo.summary网络结构可视化详细说明
  • python 实现gaussian高斯算法
  • Vuex快速入门
  • mysql等相关面试题
  • Sentinel实时监控不展示问题
  • kali2023安装docker
  • SprinBoot+Vue老年医疗保健网站的设计与实现
  • 使用ffmpeg在视频中绘制矩形区域
  • 【重学 MySQL】十八、逻辑运算符的使用
  • CentOS系统上Node.js安装与配置最佳实践
  • IIS 反向代理模块: URL Rewrite 和 Application Request Routing (ARR)
  • Vuex:深入理解所涉及的几个问题
  • [数据集][目标检测]石油泄漏检测数据集VOC+YOLO格式6633张1类别
  • 深入探索嵌入式 Linux
  • 【大模型基础】P2 Bag-of-Words
  • C语言深入理解指针五(18)
  • python测试开发基础---threading
  • 随机数与随机数种子
  • java网络编程TCP通信实战:共享聊天室
  • Reduce:一款开源的短网址平台!!【送源码】
  • WEB渗透权限维持篇-映像劫持