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

server/2024/10/11 13:30:18/

一.作业

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;}// 访问容器中任意一个元素 atT &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.ppmy.cn/server/112221.html

相关文章

经验笔记:持续集成/持续部署(CI/CD)流程

持续集成/持续部署&#xff08;CI/CD&#xff09;流程经验笔记 随着软件开发的快速发展&#xff0c;持续集成&#xff08;Continuous Integration, CI&#xff09;和持续部署&#xff08;Continuous Deployment, CD&#xff09;已经成为现代软件工程不可或缺的部分。CI/CD不仅…

Docker端口映射

Docker端口映射 1.为什么需要端口映射 外部机器访问docker容器的应用&#xff0c;需要解决2个问题: 1) 外部机器能够成功连接docker容器 2) 外部机器能够访问docker容器的端口 2.实现端口映射 docker run … -p [宿主机服务端口:]容器服务端口 … 注意&#xff1a;"宿主…

funkyheatmap |临床+组学+分组数据可视化“神器”,时髦的热图

临床数据一般是使用图表汇总Table1的方式进行展示&#xff0c;例如R|tableone 快速绘制文章“表一”-基线特征三线表 或者 gtsummary|巧合-绘制多种数据汇总表“神器” 。 今天介绍一个可视化展示方式&#xff0c;funkyheatmap-R包 &#xff0c; 可以为基准数据生成热图式可视…

【Python】如何使用pip,安装第三方库和生成二维码、操作Excel

文章目录 第三方库使用 pip安装第三方库 生成二维码1. 确定使用哪个库2. 查看对应文档3. 开始操作 操作 Excel1. 安装 xlrd2. 编写代码 第三方库 第三方库就是别人已经实现好了的库&#xff0c;我们可以拿过来直接使用 虽然标准库已经很强大了&#xff0c;但是终究是有限的&am…

【PyTorch][chapter 29][李宏毅深度学习][transformer-3] 使用PyTorch构建 Transformer

前言: 参考&#xff1a; https://www.datacamp.com/tutorial/building-a-transformer-with-py-torch, 使用PyTorch 构建Transformer 主要分为下面几步, 定义基本构建块——多头注意力、位置前馈网络、位置编码构建编码器块构建解码器块结合编码器和解码器层来创建完整的Transf…

Vue3中引用的组件如果使用了插槽,如何做到引用的组件不显示某些元素

某些场景中&#xff1a;比如vant的van-search组件&#xff1b;可以使用提供好的icon和按钮&#xff0c;也可以自定义配置&#xff1b;实现方式如下&#xff1a; 插槽写法如下&#xff1a; <template><div><div v-if"!$slots.default"><!-- 不…

Windows10上Nginx如何通过自签名证书方式发布Https服务(下)

4.客户端证书生成 4.1 生成私钥 命令: openssl genrsa -des3 -out client.key 1024 4.2 创建 CSR(证书签名请求) 配置文件:client_openssl.cnf [req] distinguished_name = req_distinguished_name req_extensions = v3_req[req_distinguished_name] countryName …

什么是云计算?

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