坐牢第三十五天(c++)

news2024/9/19 10:45:58

一.作业

1.使用模版类自定义栈

代码:

#include <iostream>
using namespace std;
template<typename T>
// 封装一个栈
class stcak
{
private:
    T *data;    //
    int max_size; // 最大容量
    int top;      // 下标
public:
    // 无参构造函数
    stcak();
    // 有参构造函数
    stcak(int size);
    // 拷贝构造函数
    stcak(const stcak &other);
    // 析构函数
    ~stcak();
    // 判空函数
    bool empty();
    // 判满函数
    bool full();
    // 扩容函数
    void resize(int new_size);
    // 返回元素个数函数
    int size();
    // 向栈顶插入元素函数
    void push(T value);
    // 删除栈顶元素函数
    T pop();
    // 访问栈顶元素函数
    T get_top();
    // 赋值重载函数
    stcak &operator=(const stcak &other);
    // 遍历栈里元素函数
    void show();
    //清空队列函数
    void clear();
};
// 无参构造函数
template<typename T>
stcak<T>::stcak() : max_size(10)
{
    data = new T[10];
    max_size = 10;
    top = -1;
    cout << "无参构造" << endl;
}
// 有参构造函数
template<typename T>
stcak<T>::stcak(int size)
{
    data = new T[size];
    max_size = size;
    top = -1;
    cout << "有参构造" << endl;
}
// 拷贝构造函数
template<typename T>
stcak<T>::stcak(const stcak &other)
{
    max_size = other.max_size;
    top = other.top;
    data = new T[max_size];
    for (int i = 0; i <= top; i++)
    {
        data[i] = other.data[i];
    }
    cout << "拷贝构造" << endl;
}
// 析构函数
template<typename T>
stcak<T>::~stcak()
{
    delete[] data;
    cout << "析构函数" << endl;
}
// 判空函数
template<typename T>
bool stcak<T>::empty()
{
    return top == -1;
}
// 判满函数
template<typename T>
bool stcak<T>::full()
{
    return top == max_size - 1;
}
// 扩容函数
template<typename T>
void stcak<T>::resize(int new_size)
{
    int *new_data = new T[new_size];
    for (int i = 0; i <= top; i++)
    {
        new_data[i] = data[i];
    }
    delete[] data;
    data = new_data;
    max_size = new_size;
}
// 返回元素个数函数
template<typename T>
int stcak<T>::size()
{
    return top + 1;
}
// 向栈顶插入元素函数
template<typename T>
void stcak<T>::push(T value)
{
    if (full())
    {
        // 调用扩容函数
        resize(max_size * 2);
    }
    data[++top] = value;
}
// 删除栈顶元素函数
template<typename T>
T stcak<T>::pop()
{
    if (empty())
    {
        cout << "栈是空的";
        return -1;
    }
    return data[top--]; // 出栈
}
// 访问栈顶元素函数
template<typename T>
T stcak<T>::get_top()
{
    if (empty())
    {
        cout << "栈是空的";
        return T();
    }
    return data[top];
}
// 赋值重载函数
template<typename T>
stcak<T> &stcak<T>::operator=(const stcak &other)
{
    if (this == &other)
    {
        return *this;
    }
    delete[] data;
    max_size = other.max_size;
    top = other.top;
    data = new T[max_size];
    for (int i = 0; i <= top; i++)
    {
        data[i] = other.data[i];
    }
    return *this;
}
// 遍历栈里元素函数
template<typename T>
void stcak<T>::show()
{
    if (empty())
    {
        cout << "遍历失败栈是空的"<<endl;
        return;
    }
    cout << "栈里元素有:"<<endl;
    for (int i = 0; i <= top; i++)
    {
        cout<< data[i] <<'\t'; 
    }
    cout <<endl;
}
//清空栈函数
template<typename T>
void stcak<T>::clear()
{
    top=-1;
    cout <<"栈已清空"<<endl;
}
/******************主函数*********************/ 
int main()
{   
    stcak<int> s;
    s.push(1);
    s.push(2);
    s.push(3);
    s.show();
    cout << "栈的大小:" << s.size() << endl;
    cout <<s.get_top()<< endl;
    s.pop();
    s.show();
    cout << "栈的大小:" << s.size() << endl;
    s.clear();
    s.show();
    return 0;
}

结果:

2.使用模版类自定义队列

代码:

#include <iostream>
using namespace std;
template<typename T>
class queue
{
private:
    T *data;    // 容器
    int max_size; // 最大容量
    int front;    // 头下标
    int tail;     // 尾下标
public:
    // 无参构造函数
    queue();
    // 有参构造函数
    queue(int size);
    // 拷贝构造函数
    queue(const queue &other);
    // 析构函数
    ~queue();
    // 判空函数
    bool empty();
    // 判满函数
    bool full();
    // 扩容函数
    void resize(int new_size);
    // 元素个数函数
    int size();
    // 向队列尾部插入元素函数
    void push(T value);
    // 删除首个元素函数 出队
    void pop();
    // 遍历队列元素
    void show();
    // 赋值重载函数
    queue &operator=(const queue &other);
    //清空队列函数
    void clear();
};
// 无参构造函数
template<typename T>
queue<T>::queue():max_size(10)
{
    data = new T[10];
    max_size = 10;
    front = tail = 0;
    cout << "无参构造" << endl;
}
// 有参构造函数
template<typename T>
queue<T>::queue(int size)
{
    data = new T[size];
    max_size = size;
    front = tail = 0;
    cout << "有参构造" << endl;
}
// 拷贝构造函数
template<typename T>
queue<T>::queue(const queue &other)
{
    max_size=other.max_size;
    front=other.front;
    tail=other.tail;
    data=new T[max_size];
    for (int i = front; i != tail; i = (i + 1) % max_size)
    {
        data[i]=other.data[i];
    }   
    cout << "拷贝构造" << endl;
}
// 析构函数
template<typename T>
queue<T>::~queue()
{
    delete[] data;
    cout << "析构函数" << endl;
}
// 判空函数
template<typename T>
bool queue<T>::empty()
{
    return front == tail;
}
// 判满函数
template<typename T>
bool queue<T>::full()
{
    return (tail+1)% max_size == front;
}
// 元素个数函数
template<typename T>
int queue<T>::size()
{
    return (tail-front+max_size) % max_size;
}
// 扩容函数
template<typename T>
void queue<T>::resize(int new_size)
{
    int *new_data = new T[new_size];
    for (int i = front; i <= tail; i++)
    {
        new_data[i] = data[i];
    }
    data = new_data;
    max_size = new_size;
    front =0;
    tail =size();
}
// 向队列尾部插入元素函数
template<typename T>
void queue<T>::push(T value)
{
    if (full())
    {
        // 调用扩容函数
        resize(max_size * 2);
    }
    data[tail] = value;
    tail = (tail + 1) % max_size;
}
// 删除首个元素函数 出队
template<typename T>
void queue<T>::pop()
{
    if (empty())
    {
        cout << "队列为空" << endl;
        return ;
    }
    cout << data[front] << "出队" << endl;
    front = (front + 1) % max_size;
    // return 0;
}
// 遍历队列元素
template<typename T>
void queue<T>::show()
{
    if (empty())
    {
        cout << "遍历失败队列为空" << endl;
        return;
    }
    cout << "队列元素:" << endl;
    for (int i = front; i != tail; i = (i + 1) % max_size)
    {
        cout << data[i] << '\t';
    }
    cout << endl;
}
// 赋值重载函数
template<typename T>
queue<T> &queue<T>::operator=(const queue &other)
{
    if (this == &other)
    {
        return *this;
    }
    delete []data;
    max_size=other.max_size;
    front=other.front;
    tail=other.tail;
    data=new T[max_size];
    for (int i = front; i != tail; i = (i + 1) % max_size)
    {
        data[i]=other.data[i];
    }
    cout << "拷贝赋值函数" <<endl;  
    return *this; 
}
//清空队列函数
template<typename T>
void queue<T>::clear()
{
    front=tail=0;
    cout << "队列已清空"<<endl;
}
/******************主函数*********************/
int main()
{
    queue<int> s;
    s.push(1);
    s.push(2);
    s.push(3);
    s.show();
    cout << "队列的大小:" << s.size() << endl;
    s.pop();
    s.show();
    cout << "队列的大小:" << s.size() << endl;
    s.clear();
    s.show();
    return 0;
}

结果:

3.使用模版类自定义动态数组

代码:

#include <iostream>
#include <cstring> // 引入cstring以使用memcpy
using namespace std;

template <typename T>
class SeqList
{
private:
    T *data;      // 顺序表的数组
    int max_size; // 容器最大内存
    int size = 0; // 数组的大小
    int len = 0;  // 顺序表实际长度

public:
    // 构造函数
    SeqList()
    {
        init(10, 100);
    }

    SeqList(int s, int max_s)
    {
        init(s, max_s);
    }

    // 析构函数
    ~SeqList()
    {
        free();
    }

    // 拷贝构造
    SeqList(const SeqList<T> &other)
    {
        init(other.size, other.max_size);
        for (int i = 0; i < other.len; i++)
        {
            add(other.data[i]);
        }
    }
    // 初始化函数
    void init(int s, int max_s)
    {
        max_size = max_s;
        size = s;           // 当前数组的最大容量
        data = new T[size]; // 在堆区申请一个顺序表容器
    }
    // 判空函数
    bool empty()
    {
        return len == 0;
    }
    // 判满函数
    bool full()
    {
        return size==len;
    }

    // 添加数据函数
    bool add(T e)
    {
        if (data == NULL)
        {
            cout << "添加数据失败" << endl;
            return false;
        }
        if (full())
        {
            if (len == max_size)
            {
                cout << "添加数据失败,内存已满" << endl;
                return false;
            }
            expend();
        }
        data[len++] = e;
        cout << "添加数据成功" << endl;
        return true;
    }
    // 求当前顺序表的实际长度
    int length()
    {
        return len;
    }
    // 任意位置插入函数
    bool insert_pos(int pos, T e)
    {
        if (data == NULL || pos < 0 || pos > len)
        {
            cout << "插入数据失败" << endl;
            return false;
        }
        if (full())
        {
            expend();
        }
        for (int i = len - 1; i >= pos; i--)
        {
            data[i + 1] = data[i];
        }
        data[pos] = e;
        len++;
        cout << "插入数据成功" << endl;
        return true;
    }
    // 任意位置删除函数
    bool delete_pos(int pos)
    {
        if (data == NULL || SeqList::empty() || pos < 0 || pos >= len)
        {
            cout << "删除数据失败" << endl;
            return false;
        }
        for (int i = pos + 1; i < len; i++)
        {
            data[i - 1] = data[i];
        }
        len--;
        cout << "删除数据成功" << endl;
        return true;
    }
    // 访问容器中任意一个元素 at
    T &at(int index)
    {
        if (data == NULL || SeqList::empty() || index < 0 || index >= len)
        {
            cout << "访问数据失败" << endl;
        }
        return data[index];
    }
    // 遍历整个数组输出
    void show()
    {
        if (data == NULL || SeqList::empty())
        {
            cout << "遍历数组失败" << endl;
            return;
        }
        cout << "数组中的数据:" << endl;
        for (int i = 0; i < length(); i++)
        {
            cout << data[i] << '\t';
        }
        cout << endl;
    }

    // 君子函数:二倍扩容
    void expend()
    {
        T *temp;
        size = 2 * size;
        temp = new T[size];
        memcpy(temp, data, sizeof(T) * len);
        free();
        data = temp;
    }

    // 释放函数
    void free()
    {
        delete[] data;
        data = NULL;
        cout << "释放空间成功" << endl;
    }
};

int main()
{
    SeqList<int> L;
    L.add(1);
    L.add(2);
    L.add(3);
    L.add(4);
    L.add(5);
    L.add(6);
    L.add(6);
    L.add(6);
    L.add(99);
    L.add(99);
    L.add(99);
    L.add(99);
    L.show();
    L.free();
    L.show();
    return 0;
}

结果:

二.思维导图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux操作系统 :文件管理(实验报告)

一、实验目的 熟练掌握Shell特性和文件管理命令的使用方法 二、实验环境 硬件&#xff1a;PC电脑一台&#xff0c;网络正常&#xff1b; 配置&#xff1a;win10系统&#xff0c;内存大于8G 硬盘500G及以上 软件&#xff1a;VMware、Ubuntu16.04、 三、实验内容 Linux的文件…

【python】socket 入门以及多线程tcp链接

Socket 入门 及 多线程tcp链接 网络基础知识三要素 Socket是套接字的意思,是网络编程的核心对象,通信两端都独有自己的Socket对象, 数据在两个Socket之间通过 字节流(TCP协议) 或者 数据报包(UDP协议)的形式进行传输. 本文主要针对tcp流程进行讲解 socket-tcp流程图 1.创建服…

面试高频:MySQL索引

1 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c; 并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。&#xff08;具体细节在后续的数据库原理课程讲解&#xff09; 2 作用 数据库中的表…

栈栈栈专题

一、基础 Leetcode 3174. 清除数字 class Solution { public:string clearDigits(string s) {string st; // 用string模拟栈的行为for(auto& v: s){if(isdigit(v)) st.pop_back();else st v;}return st;} }; 二、进阶 三、邻项消除 四、合法括号字符串 五、…

录屏快捷键不再神秘!2024年3款高效工具推荐

这年头&#xff0c;数字化了&#xff0c;录屏变成了我们学习、工作、娱乐时候的必备技能。不管我们是想录个教学视频、直播游戏还是记下会议内容&#xff0c;有个给力的录屏软件能省不少事。今儿&#xff0c;我给你说说2024年大家特别喜欢的三款录屏工具&#xff0c;它们不仅功…

RK3588 环境搭建

安装系统 参考3588用户手册安装系统安装qt install_qt.sh打开工程 下载runtime rknn-toolkit2-master.zip 5.1 解压 5.2 将/home/orangepi/works/rknn-toolkit2-master/rknpu2/runtime 拷贝到/home/orangepi/env_3588/下面 头文件所在目录 5.3 orangepiorangepi5plus:~/work…

源代码一定要加密!11款超级好用的源代码加密软件排行榜

在信息爆炸的时代&#xff0c;源代码的安全性成为了软件开发行业不可忽视的关键议题。加密&#xff0c;作为守护代码安全的利剑&#xff0c;其重要性不言而喻。对于开发者而言&#xff0c;选择一款高效、可靠的源代码加密软件&#xff0c;不仅能够有效保护知识产权&#xff0c;…

智慧体育馆如何区别于传统场馆?

在科技日新月异的今天&#xff0c;智慧体育馆作为现代体育与信息技术深度融合的产物&#xff0c;正逐步颠覆着传统场馆的运营模式与体验方式。它不仅代表了体育设施向智能化、数字化转型的必然趋势&#xff0c;更是提升全民体育参与热情、促进体育产业升级的关键一环。 智慧体…

什么是云计算?

1.云计算的概念&#xff1f; 现阶段广为人们所接受的是美国国家标准与技术研究院&#xff08;National Institute of Standards and Technology&#xff0c;NIST&#xff09;给出的定义&#xff1a;“云计算”是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、…

汽车电子行业知识:关于域控制器

车载域控制器&#xff08;Vehicle Domain Controller, VDC&#xff09;是现代汽车电子架构中的关键组件&#xff0c;负责整合和管理多个电子控制单元&#xff08;ECU&#xff09;&#xff0c;以提高车辆的智能化和自动化水平。 1. 定义与功能 车载域控制器是一个集中式的计算…

让Windows保持低资源使用率的10个习惯,看下有没有你想要的

序言 十年前,一台低端Windows电脑是我的日常驱动力。它只有4GB的RAM,一个低端处理器,没有专用的图形卡。尽管存在这些局限性,但我过去常常明智地管理资源以避免性能问题。今天,我将分享我当时所依赖的技巧,这些技巧在今天仍然有效。 使用轻量级程序 首先,考虑用不会占…

ai聊天软件哪个好?建议看看这5个“聊天搭子”

你知道吗&#xff1f;现在除了饭搭子、奶茶搭子之外&#xff0c;现在还流行一种特别的“搭子”——聊天搭子。 不过&#xff0c;这种搭子有点特别&#xff0c;它们不会感到疲倦&#xff0c;也不会因忙碌而忽略你&#xff0c;因为它们就是ai聊天免费软件。无论是分享一天的趣事…

【系统架构设计师-2009年】综合知识-答案及详解

更多内容请见&#xff1a; 备考系统架构设计师-核心总结索引 文章目录 【第1题】【第2~4题】【第5题】【第6题】【第7~8题】【第9~10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第21题】【第22题】【第23题】…

HelpLook VS Baklib:一对一比较

HelpLook VS Baklib 企业帮助中心搭建软件对比产品对比 文档编辑体验文档编辑流程3 步6 步富文本编辑器✔✖文档效果所见即所得✔✖导入文档支持批量导入Word和Markdown格式文件✖导出备份支持导出为PDF、HTML和Markdown格式仅支持json格式自定义域名绑定流程域名解析1. 购…

opencv实战项目二十:检测箱盖的旋转角度以及位置

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、算法流程&#xff1a;二、算法实现&#xff1a;2.1 二值化箱盖并获取最大轮廓&#xff1a;2.2 凸包与多边形近似提取矩形2.3 最小外接矩形获取角度与位置 三…

动能方案 | 血糖监测仪解决方案

随着糖尿病患者数量的增加和人们健康意识的提升&#xff0c;血糖监测仪成为了日常健康管理的重要设备。市场对便携、智能且易于使用的血糖监测仪需求持续增长&#xff0c;而无线通信技术&#xff0c;尤其是蓝牙技术&#xff0c;已成为现代血糖监测仪的核心组件&#xff0c;提供…

【数据分享】2000-2022年我国省市县三级的逐日O3数据(免费获取\excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000-2022年的省市县三级的逐日PM2.5数据、2013-2022年的省市县三级的逐日CO数据、2013-2022年的省市县三级的逐日SO2数据、2008-2022年我国省市县三级的逐日NO2数据和2000-2022年我国省市县三级…

监控台在特定场所的应用需要注意哪些?

监控台作为监控系统的核心操作平台&#xff0c;其在特定场所的应用显得尤为重要。然而&#xff0c;不同场所因其功能、环境及安全需求的差异&#xff0c;对监控台的应用提出了不同的要求与注意事项。本文将给大家从几个关键方面探讨监控台在特定场所应用时需要注意的事项。 1. …

自定义查询模板,调起查询弹框

查询模板初始化 导入一个新的查询模板 配置模板查询内容 将导入的模板 分配到对应的单据上 调起查询弹框private IBillReferQuery setConditionClient(String templateId,Container parent, String pkOperator, String funNode, String pkCorp) {TemplateInfo ti = new Temp…

图片尺寸不合适?这3款免费好用的AI绘图神器帮你免费无缝拓展!一键扩展画面之外的内容,真的泰裤啦!

大家好&#xff0c;我是画画的小强 在处理图片素材时&#xff0c;大家有没有遇到过尺寸不合适但又不能裁切的情况&#xff1f;是不是也想过图像要是能自己“长”出一块就好了&#xff1f;这种要求在以前或许很难实现&#xff0c;但生产式 AI 技术出现后它就不再是问题了&#…