作业-12.9【手动实现封装栈、队列模板类】

news2024/10/7 18:30:26

代码实现

#include <iostream>
#include <queue>
using namespace std;
 
 
template <typename T>
class My_queues
{
private:
    //队列数据存储空间
    T *data;
    //头下标
    int head;
    //尾下标
    int tail;
    int max_len;
public:
    //无参构造函数
    My_queues():data(NULL),head(0),tail(0),max_len(1){}
 
 
    //拷贝构造
    My_queues(My_queues<T> &other):data(new T[other.max_len+1]),head(other.head),tail(other.tail),max_len(other.max_len)
    {
        memcpy(data, other.data, sizeof(T)*other.max_len);
    }
 
 
    //拷贝赋值函数
    My_queues &operator=(const My_queues<T> &other)
    {
        if(this != &other)
        {
            delete []data;
            data = new T[other.max_len+1];
            memcpy(data, other.data, sizeof(T)*other.max_len);
            head = other.head;
            tail = other.tail;
            max_len = other.max_len;
        }
        return *this;
    }
 
 
    //析构函数
    ~My_queues()
    {
        if(NULL != data)
        {
            delete []data;
            data = NULL;
        }
    }
 
 
 
 
 
 
    //empty如果为空返回真
    bool empty()
    {
        if(NULL == data || head == tail)
        {
            return true;
        }else
        {
            return false;
        }
    }
 
 
    //back返回最后一个元素
    T &back()
    {
        return data[(tail-1+max_len)%max_len];
    }
 
 
    //判满
    bool full()
    {
        if(head == (tail+1)%(max_len+1))
        {
            return  true;
        }else
        {
            return  false;
        }
 
 
    }
    //将两个指针所指向空间的内容赋值
 
 
 
 
    //front返回第一个元素
    T &front()
    {
        return data[head];
    }
 
 
    //pop删除队列中的一个元素
    void pop()
    {
        if(empty())
        {
            cout << "队列为空,删除失败。" <<endl;
        }else
        {
            data[head] = (T)0;
            head = (head+1)%(max_len+1);
        }
    }
 
 
    //push增加一个元素
    void push(const T &val)
    {
        if(full())
        {
            //建立临时指针接一下空间,将原先的内容拷贝到新空间中
            T *temp = new T[2*max_len+1];
            memcpy(temp, data, sizeof(T)*max_len);
 
 
            //释放原先的空间
            delete []data;
 
 
            //将数据指针指向扩容后的空间
            data = temp;
 
 
            //增加元素
            max_len *= 2;
            *(data+tail) = val;
            tail = (tail+1)%(max_len+1);
        }else if(NULL == data)
        {
            data = new T[1];
            max_len = 1;
            *(data+tail) = val;
            tail = (tail+1)%(max_len+1);
        }else
        {
            *(data+tail) = val;
            tail = (tail+1)%(max_len+1);
        }
    }
 
 
    //判断队列中的元素个数
    int size()
    {
       if(tail > head)
       {
           return tail -head;
       }else
       {
           return tail-head+max_len;
       }
    }
 
 
};
 
 
template <typename T>
class My_Stacks
{
private:
    //队列数据存储空间
    T *data;
    //头下标
    int top;
    //最大元素
    int max_len;
public:
    //无参构造函数
    My_Stacks():data(NULL),top(-1),max_len(1){}
 
 
    //拷贝构造
    My_Stacks(My_Stacks<T> &other):data(new T[other.max_len+1]),top(other.top),max_len(other.max_len)
    {
        memcpy(data, other.data, sizeof(T)*other.max_len);
    }
 
 
    //拷贝赋值函数
    My_Stacks &operator=(const My_Stacks<T> &other)
    {
        if(this != &other)
        {
            delete []data;
            data = new T[other.max_len];
            memcpy(data, other.data, sizeof(T)*(top+1));
            top = other.top;
            max_len = other.max_len;
        }
        return *this;
    }
 
 
    //析构函数
    ~My_Stacks()
    {
        if(NULL != data)
        {
            delete []data;
            data = NULL;
        }
    }
 
 
 
 
 
 
    //empty如果为空返回真
    bool empty()
    {
        if(NULL == data || top == -1)
        {
            return true;
        }else
        {
            return false;
        }
    }
 
 
    //判满
    bool full()
    {
        if(top == (max_len-1))
        {
            return  true;
        }else
        {
            return  false;
        }
 
 
    }
 
 
    //front返回栈顶元素
    T &front()
    {
        if(top < 0)
        {
            cout<< "栈为空" <<endl;
            return data[0];
        }
        return data[top];
    }
 
 
    //pop从栈顶删除元素
    void pop()
    {
        if(empty())
        {
            cout << "栈为空,删除失败。" <<endl;
        }else
        {
            data[top] = (T)0;
            top = top-1;
        }
    }
 
 
    //push压栈增加元素
    void push(const T &val)
    {
        if(full())
        {
            //建立临时指针接一下空间,将原先的内容拷贝到新空间中
            T *temp = new T[2*max_len+1];
            memcpy(temp, data, sizeof(T)*max_len);
 
 
            //释放原先的空间
            delete []data;
 
 
            //将数据指针指向扩容后的空间
            data = temp;
 
 
            //增加元素
            max_len *= 2;
            data[++top] = val;
        }else if(NULL == data)
        {
            data = new T[1];
            max_len = 1;
            data[++top] = val;
        }else
        {
            data[++top] = val;
        }
    }
    //判断队列中的元素个数
    int size()
    {
       if(top<0)
       {
           return 0;
       }else
       {
           return top+1;
       }
    }
};
int main()
{
    cout<< "******************FIFO******************" <<endl;
    My_queues<int> q1;
    cout << "my_empty()           \t= " << boolalpha << q1.empty() << endl;
    q1.push(10);
    cout << "my_front()           \t= " << q1.front() << endl;
    cout << "my_size()            \t= " << boolalpha << q1.size() << endl;
    q1.push(100);
    cout << "my_size()            \t= " << boolalpha << q1.size() << endl;
    cout << "my_front()           \t= " << q1.front() << endl;
    cout << "my_back()           \t= " << q1.back() << endl;
    My_queues<int> q3(q1);
    cout << "拷贝构造后的元素个数 \t= " << q3.size() << endl;
    cout << "my_front()           \t= " << q1.front() << endl;
    cout << "my_back()           \t= " << q1.back() << endl;
    My_queues<int> q4 = q1;
    cout << "拷贝赋值后的元素个数 \t= " << q4.size() << endl;
    cout << "my_front()           \t= " << q1.front() << endl;
    cout << "my_back()           \t= " << q1.back() << endl;
    q1.pop();
    cout << "pop,my_size()      \t= " << boolalpha << q1.size() << endl;
    cout << "my_front()           \t= " << q1.front() << endl;
    cout << "my_back()           \t= " << q1.back() << endl;
    /**********************************************************************************************/
    cout<< "******************LIFO******************" <<endl;
    My_Stacks<int> s1;
    cout << "s1.empty()  \t=  " << s1.empty() << endl;
    s1.push(100);
    cout << "s1.front()  \t=  " << s1.front() << endl;
    My_Stacks<int> s2(s1);
    cout << "s2.empty()  \t=  " << s2.empty() << endl;
    cout << "s2.front()  \t=  " << s2.front() << endl;
     My_Stacks<int> s3 = s1;
     cout << "s3.empty()  \t=  " << s2.empty() << endl;
     cout << "s3.front()  \t=  " << s2.front() << endl;
     s1.push(1000);
     cout << "s1.size()  \t=  " << s1.size() << endl;
     cout << "s1.front()  \t=  " << s1.front() << endl;
     s1.pop();
     cout << "s1.size()  \t=  " << s1.size() << endl;
     cout << "s1.front()  \t=  " << s1.front() << endl;
     s1.pop();
     cout << "s1.size()  \t=  " << s1.size() << endl;
     cout << "s1.front()  \t=  " << s1.front() << endl;
 
    return 0;
}

 

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

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

相关文章

信息搜集方法总结

文章目录前言一、域名和IP信息搜集&#xff08;一&#xff09;判断是否使用CDN&#xff08;二&#xff09;存在CND时查找真实IP&#xff08;三&#xff09;WHOIS信息查询&#xff08;四&#xff09;备案信息查询&#xff08;五&#xff09;给定IP反查其他信息&#xff08;六&am…

实现微信通知提醒的方法总结

一、使用企业微信群机器人接口效果&#xff1a;微信群消息通知优点&#xff1a;后台运行不受干扰性能稳定、群内多人同时接收通知、无需登录微信、支持微信图文消息缺点&#xff1a;只适用于企业微信群、有发送频率限制使用方法&#xff1a; 1、拉一个企业微信群&#xff0c;在…

TACL 2022 | GAL:合成文本在自然语言处理任务中的应用

©PaperWeekly 原创 作者 | 何玄黎单位 | 伦敦大学学院&#xff08;UCL&#xff09;研究方向 | 自然语言处理论文标题&#xff1a;Generate, Annotate, and Learn: NLP with Synthetic Text收录会议&#xff1a;TACL 2022论文链接&#xff1a;https://arxiv.org/abs/2106.…

无需注册试用ChatGPT

无需注册试用ChatGPT OpenAI账号有诸多限制&#xff0c;包括地区限制&#xff0c;手机号注册等&#xff0c;参考ChatGPT注册试用全攻略。不开全局代理&#xff0c;还会出现Not available OpenAIs services are not available in your country. 所以有没有什么途径&#xff0c;…

ADI Blackfin DSP处理器-BF533的开发详解17:IIS+AUDIO音频codec的应用(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 很早期做的设计&#xff0c;用的是TI的一颗音频codec&#xff0c;如果要放到今天&#xff0c;我肯定是用ADI的SigmaDSP了&#xff0c;ADI所有的Si…

【计算机图形学入门】笔记5:光栅化(三角形的离散化)

目录05光栅化&#xff08;三角形的离散化&#xff09;1.Canonical Cube to Screen 从标准立方体到屏幕1.屏幕是什么&#xff1f;What is a screen?2.光栅化是什么&#xff1f;Raster screen in German3.像素Pixel (FYI, short for “picture element”)4.使用以下矩阵公式将中…

基于蜂虎狩猎 (BEH) 算法求解单目标优化问题附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【克罗地亚VS巴西】和【荷兰VS阿根廷】足球的魅力

两场球赛你看了吗时间段克罗地亚 VS 巴西荷兰 VS 阿根廷最后的话时间段 &#x1f34b;12月09日的 23:00 克罗地亚 VS 巴西 &#x1f34a;12月10日的 03:00 荷兰 VS 阿根廷 克罗地亚 VS 巴西 半场比赛双方都没有找到绝佳的破门良机&#xff0c;0-0战平。 90分钟内&#xff…

Java的线程及多线程

1 线程 1.1 Thread 下面是两个demo&#xff0c;第一个是线程执行顺序&#xff0c;第二个是多个线程的顺序。 其中线程的start可以看成是就绪状态&#xff0c;cpu并不一定会马上去执行run方法的内容&#xff0c;因此如果是多线程&#xff0c;顺序是不确定的。 public class Th…

【Pytorch】第 6 章 :用函数逼近扩展学习

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

【GRU回归预测】基于门控循环单元GRU实现数据多维输入单输出回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

英方软件通过注册:预计年营收2亿 为胡军擎与江俊夫妻店

雷递网 雷建平 12月8日上海英方软件股份有限公司&#xff08;简称&#xff1a;“英方软件”&#xff09;日前通过注册&#xff0c;准备在科创板上市。英方软件计划募资5.7亿元&#xff0c;其中&#xff0c;2.46亿元用于行业数据安全和业务连续性及大数据复制软件升级项目&#…

JavaScript:错误处理

一个优秀的产品&#xff0c;需要有一个良好的错误处理策略可以让用户知道到底发生什么。不至于让用户自己不知道发生了什么&#xff0c;然后再重试或者是不至于然用户感到特别厌烦&#xff0c;然后直接离开。 try/catch语句 try/catch语句&#xff0c;在JavaScript中作为处理…

51 java.lang.Class/java.lang.ClassLoader/InstanceKlass/ClassloaderData 的卸载

前言 之前 碰到了一个 flink 基于 ChildFirstClassLoader 来进行任务隔离 导致的内存泄漏的问题 然后 使用 demo 复现了一下 问题 之后 想探索一下 java language 中 类型的卸载相关 并且会 拓展一些其他的知识 以下测试用例基于 jdk8, 部分截图基于 jdk9 测试用例 T…

0行代码拿210万年薪,ChatGPT催生新型「程序员」岗:工作纯靠和AI聊天

梦晨 发自 凹非寺量子位 | 公众号 QbitAI靠玩ChatGPT&#xff0c;还能找到新工作&#xff1f;没错&#xff0c;Riley Goodside&#xff08;后面叫他好面哥&#xff09;4月份开始在网上发布玩GPT-3的心得。最近ChatGPT一波爆火&#xff0c;他不光粉丝涨了一万多&#xff0c;还收…

『 云原生·Docker』Docker中部署Nginx

系列文章目录 本系列主要分为以下六大部分,正在更新中,尽请期待&#xff01; 『 云原生生之门』 『 云原生前置知识』 『 云原生Docker』 『 云原生Kubernetes』 『 云原生KubeSphere』 『 云原生DevOps』 &#x1f6a9;点击关注本专栏 提示&#xff1a;已经更新的或正在更新的…

自动驾驶之MultiPath++论文阅读笔记

预测道路参与者的future behavior. 摘要 将输入由dense image-based encoding改为a sparse encoding of heterogeneous scene elements. 即用polylines(折现)来描述road features和原始的agent state information(例如位置、速度和加速度)。 主要方法是对这些元素进行a conte…

【POJ No. 2778】DNA 序列 DNA Sequence

【POJ No. 2778】DNA 序列 DNA Sequence 北大OJ 题目地址 【题意】 DNA序列是一个只包含A、C、T和G的序列。分析DNA序列片段非常有用&#xff0c;若动物的DNA序列包含片段ATC&#xff0c;则意味着该动物可能患有遗传病。 给定m 个遗传病片段&#xff0c;求有多少种长度为n 的…

自动驾驶两大路线对决,渐进式玩家为何更容易得人心?

HiEV消息&#xff08;文/长海&#xff09;对自动驾驶赛道而言&#xff0c;2022年的冬天格外冷冽。寒潮袭来&#xff0c;从各家的应变方式看&#xff0c;不同路径的玩家呈现“冰火两重天”&#xff0c;进化的趋势也越来越清晰。 以Waymo为代表、持续研发L4级无人驾驶的跨越式路线…

web课程设计网页规划与设计 :DW旅游主题网页设计——凤阳智慧旅游官方-地方旅游网站模板html源码HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…