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

embedded/2024/9/22 14:54:32/

一.作业

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/embedded/108532.html

相关文章

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集&#xff08;Garbage Collection&#xff0c;GC&#xff09;机制是Java语言的一大特色&#xff0c;它负责自动管理内存的回收&#xff0c;释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍&#xff1a; 一、垃圾收集机制概述&#xff1a; …

鸿蒙双向认证

鸿蒙双向认证 开发环境 基于API12 参考文档 切换到鸿蒙也要用上双向认证。使用的其中的 rcp 功能&#xff0c;详细文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/remote-communication-rcp-V5 双向认证包含两个方向&#xff0c;分为客户端验证…

10,sql约束(2)

MySQL中primary key和unique的区别 总体而言&#xff0c;主键用于唯一标识表中的每一行记录&#xff0c;而Unique key用于确保某列或列组合的值在表中是唯一的&#xff0c;但它不一定是用来标识记录的主要手段 在sql、oracle中的constrain有两种约束&#xff0c;都是对列的唯一…

OpenCV结构分析与形状描述符(8)点集凸包计算函数convexHull()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 查找一个点集的凸包。 函数 cv::convexHull 使用斯克拉斯基算法&#xff08;Sklansky’s algorithm&#xff09;来查找一个二维点集的凸包&#…

golang hertz框架入门

两种模式新建项目 1、手动新建项目 2、使用hz工具新建项目 一、手动创建项目&#xff0c;并拉取框架 1、新建项目目录 hertz_demo_w 2、在项目跟目录新建main.go 文件 package mainimport ("context""github.com/cloudwego/hertz/pkg/app""github.…

微软发布Phi-3.5 SLM,附免费申请试用

Phi-3 模型系列是Microsoft 小型语言模型 (SLM) 系列中的最新产品。 它们旨在具有高性能和高性价比&#xff0c;在语言、推理、编码和数学等各种基准测试中的表现均优于同类和更大规模的模型。Phi-3 模型的推出扩大了 Azure 客户的高质量模型选择范围&#xff0c;为他们编写和…

分类评价指标

分类算法的评价指标用于衡量模型在分类任务中的表现&#xff0c;帮助判断模型的好坏和适用性。以下是常用的分类评价指标&#xff1a; 1. 准确率 (Accuracy) 定义: 正确分类的样本数占总样本数的比例。公式: \[ \text{Accuracy} \frac{TP TN}{TP TN FP FN} \]适用场景: …

iOS——atomic、nonatomic、assign、_unsafe_unretain

atomic和nonatomic 在iOS开发中&#xff0c;当你定义一个属性时&#xff0c;编译器会自动为你生成一个带下划线的成员变量&#xff08;实例变量&#xff09;以及对应的getter和setter方法。如果你使用atomic修饰这个属性&#xff0c;那么编译器在生成setter和getter方法时&…