9.27作业

news2024/11/16 23:40:39

顺序表

SeqList.h

#ifndef SEQLIST_H
#define SEQLIST_H
#include <iostream>
#include<memory.h>
#include<stdlib.h>
#include<string.h>
using namespace std;

//封装一个顺序表
template <typename T>
class SeqList
{
private:
    T *ptr;        //指向堆区空间的起始地址
    int size;             //总长度
    int len = 0;          //当前顺序表实际长度
public:
    //初始化
    // 默认构造函数
    SeqList() : ptr(nullptr), size(0), len(0) {}

    // 构造函数接受数组和大小
    SeqList(T* arr, int n) : size(n), len(n) {
        ptr = new T[n];
        for (int i = 0; i < n; i++) {
            ptr[i] = arr[i];
        }
    }

    // 构造函数接受字符串
    SeqList(const std::string& str) {
       size = str.size();
       len = size;
       ptr = new T[size];
       for (int i = 0; i < size; i++) {
           ptr[i] = static_cast<T>(str[i] - '0'); // 假设字符串是数字字符
           }
       }

    ~SeqList() {
       delete[] ptr;
    }
    //判空
    bool empty();
    //判满
    bool full();
    //尾插
    void push_back(T e);
    //定义展示函数
    void show();
    //插入
    void insert(int index);
    //任意位置删除
    void delete_s(int index);
    //尾删: pop_back
    void pop_back();
    //求长度:size()
    T get_len();
    //获取任意位置元素:& at(int inex)
    T get_index(int index);
    //将顺序表进行排序:sort(bool flag)flag 为真,表示升序,否则是降序
    void sort(bool flag);
};
#endif // SEQLIST_H

SeqList.cpp

#include "SeqList.h"

// 判空
template <typename T>
bool SeqList<T>::empty()
{
    return this->len == 0;
}

// 判满
template <typename T>
bool SeqList<T>::full()
{
    return this->len == this->size;
}

// 尾插
template <typename T>
void SeqList<T>::push_back(T e)
{
    if (this->full())
    {
        cout << "顺序表已满,无法插入!" << endl;
        return;
    }
    this->ptr[len++] = e;
}

// 定义展示函数
template <typename T>
void SeqList<T>::show()
{
    if (this->empty()) {
        cout << "顺序表为空!" << endl;
        return;
    }
    cout << "当前顺序表中的元素分别是:";
    for (int i = 0; i < this->len; i++)
    {
        cout << this->ptr[i] << " ";
    }
    cout << endl;
}

// 插入
template <typename T>
void SeqList<T>::insert(int index)
{
    if (this->full())
    {
        cout << "表已经满了!" << endl;
        return;
    }
    if (index > this->len + 1 || index <= 0)
    {
        cout << "插入位置不合理" << endl;
        return;
    }
    T e;
    cout << "请输入插入元素:";
    cin >> e;
    for (int i = len - 1; i >= index - 1; i--)
    {
        this->ptr[i + 1] = this->ptr[i];
    }
    this->ptr[index - 1] = e;
    this->len++;
}

// 任意位置删除
template <typename T>
void SeqList<T>::delete_s(int index)
{
    if (index > this->len || index <= 0)
    {
        cout << "删除位置不合理" << endl;
        return;
    }
    for (int i = index; i < this->len; i++)
    {
        this->ptr[i - 1] = this->ptr[i];
    }
    this->len--;
}

// 尾删: pop_back
template <typename T>
void SeqList<T>::pop_back()
{
    if (this->len == 0)
    {
        cout << "顺序表为空!" << endl;
        return;
    }
    this->len--;
}

// 求长度:size()
template <typename T>
T SeqList<T>::get_len()
{
    return this->len;
}

// 获取任意位置元素
template <typename T>
T SeqList<T>::get_index(int index)
{
    if (index > this->len || index <= 0)
    {
        cout << "位置不合理" << endl;
        return T(); // 返回一个默认值
    }
    return this->ptr[index - 1];
}

// 将顺序表进行排序:sort(bool flag)flag 为真,表示升序,否则是降序
template <typename T>
void SeqList<T>::sort(bool flag)
{
    for (int i = 0; i < this->len - 1; i++)
    {
        for (int j = 0; j < this->len - i - 1; j++)
        {
            if ((flag && this->ptr[j] > this->ptr[j + 1]) || (!flag && this->ptr[j] < this->ptr[j + 1]))
            {
                T t = this->ptr[j];
                this->ptr[j] = this->ptr[j + 1];
                this->ptr[j + 1] = t;
            }
        }
    }
}

// 显式实例化
template class SeqList<int>; // 显式实例化 int 类型的 SeqList

main.cpp

#include "SeqList.h"

int main()
{
    // 使用数组创建顺序表对象
    int arr[] = {1, 2, 3, 4, 5}; // 示例数组
    SeqList<int> sl(arr, 5); // 使用数组初始化顺序表
    sl.show();

    // 或者使用字符串创建顺序表对象
    // SeqList<int> sl("12345"); // 使用字符串初始化顺序表
    // sl.show();

    // 其他操作
    int add;
    cout << "请输入插入数据的位置:";
    cin >> add;
    sl.insert(add);
    sl.show();

    cout << "请输入删除数据的位置:";
    cin >> add;
    sl.delete_s(add);
    sl.show();

    int c;
    cout << "是否尾删(1:YES/2:NO):";
    cin >> c;
    if (c == 1) {
        sl.pop_back();
    }
    sl.show();

    int l = sl.get_len();
    cout << "顺序表当前长度为:" << l << endl;

    int index;
    cout << "请输入需要位置:";
    cin >> index;
    cout << index << "位置数据位:" << sl.get_index(index) << endl;

    cout << "将顺序表进行排序(1:升序,0:降序):";
    cin >> c;
    sl.sort(c);
    sl.show();

    return 0;
}

MyStack.h

#ifndef MYSTACK_H
#define MYSTACK_H

#include <iostream>

using namespace std;

template <typename T>
class My_stack {
private:
    struct Node {
        T data;          // 节点数据
        Node* next;     // 指向下一个节点的指针
        Node(T value) : data(value), next(nullptr) {} // 节点构造函数
    };

    Node* topNode;      // 栈顶节点
    int stackSize;      // 栈的大小

public:
    // 构造函数
    My_stack();

    // 拷贝构造函数
    My_stack(const My_stack &other);

    // 赋值运算符
    My_stack& operator=(const My_stack &other);

    // 析构函数
    ~My_stack();

    // 返回栈顶元素
    T& top();

    // 返回栈是否为空
    bool empty() const;

    // 返回栈的大小
    int size() const;

    // 压入元素
    void push(T value);

    // 弹出元素
    void pop();

    // 交换两个栈的内容
    void swap(My_stack &other);
};

// 全局函数用于交换两个栈
template <typename T>
void swap(My_stack<T> &a, My_stack<T> &b);

#endif // MYSTACK_H

MyStack.cpp

#include "MyStack.h"

// 构造函数
template <typename T>
My_stack<T>::My_stack() : topNode(nullptr), stackSize(0) {}

// 拷贝构造函数
template <typename T>
My_stack<T>::My_stack(const My_stack &other) : topNode(nullptr), stackSize(0) {
    Node* current = other.topNode;
    while (current) {
        push(current->data);
        current = current->next;
    }
}

// 赋值运算符
template <typename T>
My_stack<T>& My_stack<T>::operator=(const My_stack &other) {
    if (this != &other) {
        // 先清空当前栈
        while (!empty()) {
            pop();
        }
        Node* current = other.topNode;
        while (current) {
            push(current->data);
            current = current->next;
        }
    }
    return *this;
}

// 析构函数
template <typename T>
My_stack<T>::~My_stack() {
    while (!empty()) {
        pop();
    }
}

// 返回栈顶元素
template <typename T>
T& My_stack<T>::top() {
    if (empty()) {
        cout << "栈空!" << endl;
        exit(EXIT_FAILURE); // 直接退出程序
    }
    return topNode->data;
}

// 返回栈是否为空
template <typename T>
bool My_stack<T>::empty() const {
    return stackSize == 0;
}

// 返回栈的大小
template <typename T>
int My_stack<T>::size() const {
    return stackSize;
}

// 压入元素
template <typename T>
void My_stack<T>::push(T value) {
    Node* newNode = new Node(value);
    newNode->next = topNode;
    topNode = newNode;
    stackSize++;
}

// 弹出元素
template <typename T>
void My_stack<T>::pop() {
    if (empty()) {
        cout << "栈空!" << endl;
        exit(EXIT_FAILURE); // 直接退出程序
    }
    Node* temp = topNode;
    topNode = topNode->next;
    delete temp;
    stackSize--;
}

// 交换两个栈的内容
template <typename T>
void My_stack<T>::swap(My_stack &other) {
    std::swap(topNode, other.topNode);
    std::swap(stackSize, other.stackSize);
}

// 全局函数用于交换两个栈
template <typename T>
void swap(My_stack<T> &a, My_stack<T> &b) {
    a.swap(b);
}

// 显式实例化
template class My_stack<int>; // 显式实例化 int 类型的 My_stack
template void swap(My_stack<int> &a, My_stack<int> &b); // 显式实例化 swap 函数

main.cpp

#include "MyStack.h"

int main() {
    My_stack<int> s;

    s.push(9);
    s.push(2);
    s.push(6);
    s.push(7);
    s.push(8);

    cout << "栈顶元素:" << s.top() << endl;
    cout << "栈的大小:" << s.size() << endl;

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

    My_stack<int> s1;
    s1.push(1);
    s1.push(2);
    My_stack<int> s2;
    s2 = s;
    swap(s2, s1); // 交换两个栈

    cout << "交换后的栈顶元素:" << s2.top() << endl;
    cout << "交换后另一个栈顶元素:" << s1.top() << endl;

    return 0;
}

队列

MyQueue.h

#ifndef MYQUEUE_H
#define MYQUEUE_H

#include <iostream>
#include <cstring>

using namespace std;

template <typename T>
class Queue {
private:
    T* data;  // 数据指针
    int len;  // 当前数量
    int size; // 最大容量
    int front; // 头索引
    int rear;  // 尾索引

public:
    // 构造函数
    Queue();
    Queue(const T* d, int size);
    // 析构函数
    ~Queue();
    // 拷贝构造
    Queue(const Queue &other);
    // 拷贝赋值
    Queue& operator=(const Queue &other);
    // front函数
    T MyFront();
    // back函数
    T back();
    // empty函数
    bool empty();
    // size函数
    int MySize();
    // push函数
    void push(T e);
    // emplace函数
    void emplace(T e);
    // pop函数
    T pop();
    // swap函数
    void swap(Queue &other);
};

#endif // MYQUEUE_H

MyQueue.cpp

#include "MyQueue.h"

// 无参构造函数
template <typename T>
Queue<T>::Queue() : len(0), size(20), front(0), rear(0) {
    data = new T[size];
}

// 有参构造函数
template <typename T>
Queue<T>::Queue(const T* d, int size) : len(strlen(d)), size(size), front(0), rear(len) {
    data = new T[size];
    strcpy(data, d);
}

// 析构函数
template <typename T>
Queue<T>::~Queue() {
    delete[] data;
}

// 拷贝构造函数
template <typename T>
Queue<T>::Queue(const Queue &other) : len(other.len), size(other.size), front(other.front), rear(other.rear) {
    data = new T[size];
    strcpy(data, other.data);
}

// 拷贝赋值运算符
template <typename T>
Queue<T>& Queue<T>::operator=(const Queue &other) {
    if (this != &other) {
        delete[] data; // 释放旧内存
        len = other.len;
        size = other.size;
        front = other.front;
        rear = other.rear;
        data = new T[size];
        strcpy(data, other.data);
    }
    return *this;
}

// MyFront函数
template <typename T>
T Queue<T>::MyFront() {
    if (empty()) {
        cout << "队列为空" << endl;
        exit(EXIT_FAILURE);
    }
    return data[front];
}

// back函数
template <typename T>
T Queue<T>::back() {
    if (empty()) {
        cout << "队列为空" << endl;
        exit(EXIT_FAILURE);
    }
    return data[rear - 1]; // rear指向下一个插入位置
}

// empty函数
template <typename T>
bool Queue<T>::empty() {
    return front == rear && len == 0;
}

// MySize函数
template <typename T>
int Queue<T>::MySize() {
    return len;
}

// push函数
template <typename T>
void Queue<T>::push(T e) {
    if (len >= size) {
        cout << "队列已满" << endl;
        return;
    }
    data[rear++] = e;
    len++;
}

// emplace函数
template <typename T>
void Queue<T>::emplace(T e) {
    push(e); // 直接调用 push 函数
}

// pop函数
template <typename T>
T Queue<T>::pop() {
    if (empty()) {
        cout << "队列为空" << endl;
        exit(EXIT_FAILURE);
    }
    len--;
    return data[front++];
}

// swap函数
template <typename T>
void Queue<T>::swap(Queue &other) {
    std::swap(len, other.len);
    std::swap(size, other.size);
    std::swap(front, other.front);
    std::swap(rear, other.rear);
    std::swap(data, other.data);
}

// 显式实例化
template class Queue<char>; // 显式实例化 char 类型的 Queue

main.cpp

#include "MyQueue.h"

int main() {
    Queue<char> q("hello world", 20);

    // 测试emplace
    q.emplace('A');
    q.emplace('B');
    q.emplace('C');

    cout << "q队首数据:" << q.MyFront() << endl;
    cout << "q队尾数据:" << q.back() << endl;
    cout << "q队列数据数量 " << q.MySize() << endl;

    // 测试 pop
    cout << "q尾删操作" << endl;
    q.pop();
    cout << "q队首数据:" << q.MyFront() << endl;

    Queue<char> q1;
    q1 = q;
    cout << "q1队首数据:" << q1.MyFront() << endl;
    cout << "q1队尾数据:" << q1.back() << endl;

    Queue<char> q2("nihao", 20); // 创建一个最大容量为 20 的队列
    cout << "交换操作" << endl;
    q.swap(q2);
    cout << "q队首数据:" << q.MyFront() << endl;
    cout << "q队尾数据:" << q.back() << endl;
    cout << "q2队首数据:" << q2.MyFront() << endl;
    cout << "q2队尾数据:" << q2.back() << endl;

    return 0;
}

思维导图

在这里插入图片描述

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

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

相关文章

如何高效精准地管理商标官文?

商标官文涵盖了商标从申请注册到后续维护的各个阶段所涉及的官方文件&#xff0c;如受理通知书、审查意见通知书、商标注册证等。这些官文不仅是商标权利的重要凭证&#xff0c;更是企业了解商标状态、应对各种情况的重要依据。有效的商标官文管理能够确保企业及时掌握商标动态…

Redis的数据类型和编码方式

目录 数据类型&#xff1a;编码方式String&#xff1a;hash&#xff1a;list&#xff1a;set&#xff1a;zset&#xff1a; 通过这个指令可以看到底层实现 数据类型&#xff1a; Redis底层实现上述数据结构的时候&#xff0c;会在源码层面&#xff0c;针对上述实现进行优化&am…

【Java】—— 多线程:随堂复习

目录 1. 几个概念 2. 如何创建多线程&#xff08;重点&#xff09; 3. Thread类的常用方法、线程的生命周期 4. 如何解决线程安全问题(重点、难点) 5. 同步机制相关的问题 6. 线程间的通信 1. 几个概念 程序(program)&#xff1a;为完成特定任务&#xff0c;用某种语言编…

NSSCTF [HUBUCTF 2022 新生赛]simple_RE(变种base64编码)

文件无壳 拖入IDA中 shiftF12查看可疑字符串 发现两串字符串 一看这两个等于号就猜测是base64编码 进入主函数看看 这段代码是一个简单的 C 语言程序&#xff0c;主要功能是接受用户输入的字符串作为“flag”&#xff0c;然后通过对输入的字符串进行一些处理和比较来验证是否输…

双十一购物节:五大必买爆款科技好物,让你省钱又省心

双十一购物节&#xff0c;作为中国最大的在线购物狂欢节&#xff0c;每年都吸引着无数消费者的眼球。在这个购物盛宴中&#xff0c;科技产品因其创新性、实用性和高性价比而成为消费者关注的焦点。随着科技的飞速发展&#xff0c;越来越多的智能设备走进了我们的生活&#xff0…

SOCKS5代理和HTTP代理哪个快?深度解析两者的速度差异

在现代互联网环境中&#xff0c;使用代理IP已经成为了许多人日常生活和工作的必备工具。无论是为了保护隐私&#xff0c;还是为了访问某些特定资源&#xff0c;代理IP都扮演着重要的角色。今天&#xff0c;我们就来聊聊SOCKS5代理和HTTP代理&#xff0c;看看这两者到底哪个更快…

什么是去中心化金融(DeFi)?

什么是去中心化金融&#xff08;DeFi&#xff09;? 传统金融特点是&#xff1f; 有中心化机构提供服务 银行 、 保险公司 、政权公司 、 基金管理公司 特点 保管用户的资产&#xff1a; 可冻结用户的账户&#xff0c;操作用户的资产作为交易中介&#xff1a; 审查交易制定…

Redis篇(Java操作Redis)

目录 讲解一&#xff1a;简介 讲解二&#xff1a;Jedis Github 一、创建项目、 二、添加依赖 三、配置文件 四、Java连接Redis 五、通过Redis连接池获取连接对象并操作服务器 六、封装JedisUtil对外提供连接对象获取方法 七、Java操作Redis五种数据类型 1. 连接与释放…

IoT网关的主要功能有哪些?天拓四方

在数字化浪潮席卷全球的今天&#xff0c;物联网&#xff08;IoT&#xff09;技术凭借其独特的优势&#xff0c;逐渐在各个领域展现出强大的生命力。而IoT网关&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;其在物联网体系中的作用愈发凸显。 一、数据聚合与预处理…

qt 高并发编程及同步

高并发编程是指在同一时间处理多个任务的能力&#xff0c;通常用于提升应用程序的性能和响应速度。Qt提供了一系列强大的工具和类来实现高并发编程&#xff0c;包括多线程、异步编程和任务调度。 一、继承QThread #include <QThread>class Worker : public QThread {voi…

基于springcloud的药品销售系统

文未可获取一份本项目的java源码和数据库参考。 一、选题背景与意义 1. 选题背景 在日常医药管理中&#xff0c;面对众多的药品和众多不同需求的顾客&#xff0c;每天都会产生大量的数据信息。以传统的手工方式来处理这些信息&#xff0c;操作比较繁琐&#xff0c;且效率低下…

重头开始嵌入式第四十四天(硬件 ARM裸机开发)

目录 裸机开发 一、开发背景 二、开发特点 三、开发流程 四、应用领域 使用的软件硬件 软件&#xff1a;keil 硬件&#xff1a;三星S3C2440A JTAG 开发原理 ​编辑 开发步骤 ​编辑 点亮小灯 按键控制亮灭 裸机开发 ARM 裸机开发是指在没有操作系统的情况…

CUDAExample: 波纹示例

需要用到的已经封装好的辅助类&#xff1a; CPUAnimBitmap 定义个grid 和 block 的维度都是二维的 #include"cpu_anim.h" #include "cuda_runtime.h" #include <device_launch_parameters.h>#define DIM 512 static void CheckCudaErrorAux(const …

numpy is not available

在测试第一个程序的时候&#xff0c;出现Numpy is not available的错误&#xff0c;根据博客的办法知道是因为numpy与pytorch版本不一致造成的。 安装的时候&#xff0c;安装的是最新版的numpy&#xff0c;检查numpy的版本为2.1.1版。 根据pytorch与numpy版本对应表。我的pyt…

【Python报错已解决】NameError: name ‘torchvision‘ is not defined

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

AI知识库如何重塑电商行业的产品推荐系统

在数字化浪潮的推动下&#xff0c;电子商务行业正经历着前所未有的变革。其中&#xff0c;产品推荐系统作为连接消费者与商品的桥梁&#xff0c;其智能化与个性化水平直接影响着用户体验、转化率乃至整个平台的竞争力。随着人工智能&#xff08;AI&#xff09;技术的飞速发展&a…

大豆重测序-文献精读53

Natural variation in GmSW17 controls seed size in soybean GmSW17的自然变异控制大豆种子的大小 摘要 种子大小/重量在决定作物产量中起着重要作用&#xff0c;但在大豆中&#xff0c;仅有少数控制种子大小的基因被鉴定出来。在本研究中&#xff0c;我们进行了全基因组关联…

Java项目——苍穹外卖总结

附上本人代码连接&#xff1a;xiaoming325/sky-take-out (github.com) 项目概述 此项目是一个外卖点餐项目&#xff0c;分为商家端&#xff08;管理员端&#xff09;和用户端&#xff0c;商家端是一个网站&#xff0c;用户端是一个微信小程序&#xff0c;由于微信小程序没有上…

Java ERP管理系统源码解析:微服务架构实践Spring Cloud Alibaba与Spring Boot

在当今数字化浪潮的推动下&#xff0c;企业对于高效、稳定且易于扩展的管理系统需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的鸿鹄ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、S…

【刷题5】在排序数组中查找元素的第一个和最后一个位置

目录 一、题目解析二、思路—二分查找(二段性)1、查找最左端区间2、查找最右端区间 三、代码 一、题目解析 题目理解&#xff1a; 返回begin和end&#xff0c;是数组下标 二、思路—二分查找(二段性) 1、查找最左端区间 left和right移动问题&#xff1a; 循环条件问题&…