【C++】day6学习成果:继承、多态、栈和循环队列

news2025/1/20 20:11:43

1.将之前定义的栈类和队列类都实现成模板类
栈:

#include <iostream>

#define MAX 8

using namespace std;

template<typename T>
class Stack
{
private:
    T *data;      //栈的数组,指向堆区空间,用于存储栈的容器
    int top;        //记录栈顶的变量
public:
    Stack():top(-1),data(new T[MAX])
    {
        cout<<"Stack::无参构造函数:初始化栈成功"<<endl;
    }
    //析构函数
    ~Stack(){
        cout<<"Stack::析构函数"<<endl;
        delete []data;
        data=nullptr;
    }
    //拷贝构造函数:深拷贝
    Stack(const Stack &other):data(new T(*other.data)),top(other.top){
        cout<<"Stack::拷贝构造函数"<<endl;
    }

    //入栈
    bool stack_push(T e)
    {
        if(top<-1)
        {
            cout<<"所给栈不合法"<<endl;
            return false;
        }else if(stack_full())
        {
            cout<<"入栈失败,栈满"<<endl;
            return false;
        }
        //先加后压
        top++;
        this->data[top]=e;
        cout<<data[top]<<"入栈成功"<<endl;
        return true;
    }

    //出栈
    bool stack_pop()
    {
        if(top<-1)
        {
            cout<<"所给栈不合法"<<endl;
            return false;
        }
        //出栈逻辑:先弹后减
        cout<<data[top]<<"出栈成功"<<endl;
        top--;
        return true;
    }

    //清空栈
    void stack_free()
    {
        if(top<-1)
        {
            cout<<"所给栈不合法"<<endl;
            return;
        }
        for(top;top>-1;top--)
        {
            stack_pop();
        }

        top=-1;

        cout<<"清空成功"<<endl;
    }

    //判空
    bool stack_empty()
    {
        if(top==-1)
        {
            return true;
        }else
        {
            if(top<-1)
            {
                cout<<"所给栈不合法"<<endl;
            }
            return false;
        }
    }

    //判满
    bool stack_full()
    {
        if(top<-1)
        {
            cout<<"所给栈不合法"<<endl;
            return false;
        }else if(top==MAX-1)
        {
            return true;
        }else
        {
            return false;
        }

    }

    //获取栈顶元素
    T stack_top()
    {
        if(top<-1||stack_empty())
        {
            cout<<"获取失败"<<endl;
            return NULL;
        }

        return data[top];
    }

    //求栈的大小
    int stack_size()
    {
        if(!stack_empty())
        {
            return top+1;
        }
        cout<<"所给链表不合法"<<endl;
        return -1;
    }

    //展示栈
    void show()
    {
        if(stack_empty())
        {
            cout<<"空栈"<<endl;
            return;
        }
        for (int i=0;i<=top;i++)
        {
            cout<<"data["<<i<<"]="<<this->data[i]<<"  ";
        }
        cout<<endl;
    }

};

int main()
{
    Stack<int> s;
    //入栈
    for(int i=MAX;i>=0;i--)
    {
        s.stack_push(i);
    }
    if(s.stack_full())
    {
        cout<<"栈满"<<endl;
    }
    //出栈
    for(int i=0;i<MAX;i++)
    {
        s.stack_pop();
    }
    s.stack_push(1);
    s.stack_push(2);
    s.stack_push(3);
    s.stack_push(11);
    s.stack_push(12);
    s.stack_push(111);
    s.show();
    cout<<"栈顶元素为:"<<s.stack_top()<<endl;
    s.stack_pop();
    s.show();
    cout<<"栈顶元素为:"<<s.stack_top()<<endl;
    s.stack_free();
    s.show();
    s.stack_push(1);
    s.show();
    cout<<"栈顶元素为:"<<s.stack_top()<<endl;
    s.stack_push(2);
    s.stack_push(3);
    s.show();
    cout<<"s栈顶元素为:"<<s.stack_top()<<endl;
    s.show();
    cout<<"****************************"<<endl;

    Stack<char> s1;
    cout<<"&s2="<<&s1<<endl;
    s1.stack_push('h');
    s1.stack_push('e');
    s1.stack_push('l');
    cout<<"s1栈顶元素为:"<<s1.stack_top()<<endl;
    s1.show();
    cout<<"****************************"<<endl;
    Stack<string> s2;
    cout<<"&s2="<<&s2<<endl;
    s2.stack_push("你好啊");
    s2.stack_push("你好吗");
    s2.stack_push("我很好");
    cout<<"s2栈顶元素为:"<<s2.stack_top()<<endl;
    s2.show();
    cout<<"****************************"<<endl;
    Stack<double> s3;
    cout<<"&s3="<<&s3<<endl;
    s3.stack_push(2.1);
    s3.stack_push(3.14);
    s3.stack_push(5.22);
    cout<<"s3栈顶元素为:"<<s3.stack_top()<<endl;
    s3.show();
    cout<<"****************************"<<endl;
    return 0;
}

循环队列:

#include <iostream>

using namespace std;

#define MAX 8

template<typename T>
class Queue
{
private:
    T *data;      //存放队列的数组,初始化时向堆区申请数组空间
    int front;      //队头位置,记录对头所在的元素下标
    int tail;      //队尾位置,记录最后一个元素的下一个下标的位置
public:
    //无参构造函数
    Queue():
        data(new T[MAX]),front(0),tail(0)
    {
        cout<<"Stack::无参构造函数:初始化循环队列成功"<<endl;
    }

    //析构函数
    ~Queue()
    {
        cout<<"Stack::析构函数"<<endl;
        delete []data;
        data=nullptr;
    }

    //拷贝构造函数
    Queue(const Queue &other):
        data(new int(*other.data)),front(other.front),tail(other.tail)
    {
         cout<<"Stack::拷贝构造函数"<<endl;
    }

    //入队
    bool Queue_push(T e)
    {
        if(Queue_full())
        {
            cout<<"入队失败\n"<<endl;
            return false;
        }
        //将数据放在队尾所在地方
        data[tail]=e;
        cout<<"data["<<tail<<"]="<<e<<" 入队成功"<<endl;
        //队尾后移
        tail=(tail+1)%MAX;
        return true;
    }

    //出队
    bool Queue_pop()
    {
        if(Queue_empty())
        {
            cout<<"出队失败\n"<<endl;
            return false;
        }
        cout<<"data["<<front<<"]="<<data[front]<<" 出队成功"<<endl;
        //队头后移
        front=(front+1)%MAX;
        return true;
    }
    //清空队
    void Queue_free()
    {
//        for(int i=front;i<tail;i++)
//        {
//            data[i]=NULL;
//        }
        front=tail=0;
        cout<<"清空队列成功"<<endl;
    }

    //判空
    bool Queue_empty()
    {
        if(front==tail)
        {
            return true;
        }else
        {
            return false;
        }
    }

    //判满
    bool Queue_full()
    {
        if((tail+MAX)%MAX==front && !Queue_empty())
        {
            return true;
        }else
        {
            return false;
        }
    }
    //求队列的大小
    int Queue_size()
    {
        return (tail+MAX-front)%MAX;
    }

    //展示元素
    void show()
    {
        if(Queue_empty())
        {
            cout<<"空队"<<endl;
            return;
        }
        for(int i=front;i<tail;i++)
        {
            cout<<"data["<<i<<"]="<<data[i]<<"  ";
        }
        cout<<endl;
    }

};

int main()
{
        Queue<int> queue;

        queue.Queue_push(1);
        queue.Queue_push(2);
        queue.Queue_push(3);
        queue.Queue_push(8);
        queue.Queue_push(9);
        queue.Queue_push(10);
        queue.Queue_push(11);
        queue.Queue_push(12);
        queue.Queue_push(13);
        queue.Queue_pop();
        queue.Queue_push(1);
        queue.show();
        queue.Queue_free();
        queue.show();
        queue.Queue_push(10);
        queue.Queue_push(11);
        queue.Queue_push(12);
        cout<<"size of queue="<<queue.Queue_size()<<endl;
        queue.show();

        cout<<"*************************"<<endl;
        Queue<int> q=queue;
        cout<<"size of q="<<q.Queue_size()<<endl;
        q.Queue_push(1);
        cout<<"size of q="<<q.Queue_size()<<endl;
        q.show();

        cout<<"*************************"<<endl;
        Queue<double> q2;
        cout<<"size of q2="<<q2.Queue_size()<<endl;
        q2.Queue_push(1.5);
        q2.Queue_push(3.5);
        q2.Queue_push(3.14);
        cout<<"size of q2="<<q2.Queue_size()<<endl;
        q2.show();
        cout<<"*************************"<<endl;

        cout<<"*************************"<<endl;
        Queue<string> q3;
        cout<<"size of q3="<<q3.Queue_size()<<endl;
        q3.Queue_push("我最喜欢吃的水果是香蕉");
        q3.Queue_push("小猫咪很可爱");
        q3.Queue_push("爱看香蕉猫");
        cout<<"size of q3="<<q3.Queue_size()<<endl;
        q3.show();
        cout<<"*************************"<<endl;

    return 0;
}

运行结果:
栈:
栈结果
循环队列:
循环队列结果
2.思维导图
C++day6

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

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

相关文章

基于元素小组的归并排序算法

问题说明 什么是针对元素小组的归并排序算法&#xff0c;举个例子&#xff1a;假如有一个数组[1,2,3,4,5,6,7,8,9]&#xff0c;{1,2,3}为一个小组&#xff0c;{4,5,6}为一个小组&#xff0c;{7,8,9}为一个小组&#xff0c;现需要根据每个小组的第一个元素来进行排序&#xff0…

upload-labs文件上传靶场实操

文章目录 1.Pass-012.Pass-023.Pass-034.Pass-045.Pass-056.Pass-067.Pass-078.Pass-089.Pass-0910.Pass-1011.Pass-1112.Pass-1213.Pass-1314.Pass-1415.Pass-1516.Pass-16 1.Pass-01 改后缀名绕过 只能上传图片&#xff0c;先上传一个jpg格式的图片&#xff0c;然后抓包改格…

如何在 Excel 中进行加,减,乘,除

在本教程中&#xff0c;我们将执行基本的算术运算&#xff0c;即加法&#xff0c;减法&#xff0c;除法和乘法。 下表显示了我们将使用的数据以及预期的结果。 | **S / N** | **算术运算符** | **第一个号码** | **第二个号码** | **结果** | | 1 | 加法&#xff08;&#xff…

企业形象片宣传片策划要从哪里展开

企业形象片宣传片是一种有效的营销工具&#xff0c;能够向潜在客户传达企业的核心价值观、品牌形象和产品服务。对于企业来说&#xff0c;一个成功的宣传片可以增加品牌知名度&#xff0c;提高销售额&#xff0c;并建立与客户的良好关系。然而&#xff0c;要想策划一部成功的企…

org.apache.hadoop.hbase.PleaseHoldException: Master is initializing

背景 CDH集群切换数据盘&#xff0c;导致服务无法启动&#xff0c;卸载重装了 hbase、hdfs、yarn、oozie、spark等服务&#xff0c;未卸载重装的zookeeper、kafka。 重装hbase后无法创建表。 报错 hbase(main):001:0> create test,cf1 ERROR: org.apache.hadoop.hbase.Pl…

【计算机网络】传输层协议——TCP(上)

文章目录 TCPTCP协议段格式报头和有效载荷如何分离&#xff1f;4位首部长度 TCP可靠性确认应答机制的提出序号和确认序号为什么序号和确认序号在不同的字段&#xff1f; 16位窗口大小 6个标志位标志位本质具体标志位PSHRSTURG 超时重传机制 文章目录 TCPTCP协议段格式报头和有效…

SAP SD之定义装运点OVL2

什么是装运点&#xff1f; 装运点是一个独立的组织实体&#xff0c;其中进行货物的发行和交付处理。 可以为每个订单商品确定一个装运点。 确定装运点取决于以下三个因素&#xff1a; 客户主记录中的运输条款和条件&#xff08;运输屏幕&#xff09;。 例如&#xff0c;公司与…

为什么选择C/C++内存检测工具AddressSanitizer?如何使用AddressSanitizer?

目录 1、C程序中的内存问题 2、AddressSanitizer是什么&#xff1f; 3、AddressSanitizer内存检测原理简述 3.1、内存映射 3.2、插桩 4、为什么选择AddressSanitizer&#xff1f; 4.1、Valgrind介绍 4.2、AddressSanitizer在速度和内存方面为什么明显优于Valgrind 4.3…

安卓最强LSPosed框架v1.9.1正式版下载-API变更-支持安卓14新系统+刷入教程

LSPosed框架自1.86以后比较稳定&#xff0c;LSPosed官方更新的也变慢了很多&#xff0c;上周开始LSP框架又开始了大版本更新&#xff0c;直接迭代到V19.1版本。单从更新日志上来看&#xff0c;这两次的更新幅度比较大&#xff0c;也修复了很多我们常见的问题。从我们正常刷入体…

C语言——字符函数和字符串函数_学习笔记

本文目录 一、字符函数1.1 字符分类函数常见的字符分类函数介绍应用举例 1.2 字符转换函数函数介绍toupper 函数举例 二、字符串函数2.1 常用的字符串函数介绍2.2 应用举例① strlen② strcpy③ strcat④ strcmp⑤ strncpy⑥ strncat⑦ strncmp⑧ strstr⑨ strtok 关于一些字符…

【新版vscode配置自动补全括号】

vscode新版配置自动补全括号方法 新版配置方法(Pylance) ①设置 -> 扩展 -> Pylance -> 将 python.analysis.completeFunctionParens 下方的选项打勾 ②直接在settings.json中添加"python.analysis.completeFunctionParens": true

书单背景图和视频制作方法分享

如今&#xff0c;在社交媒体上发布一张书单背景图或宣传视频已成为推广阅读和书籍的流行方式。这些视觉内容能够吸引读者的眼球并提供一些简单易懂的信息&#xff0c;如书名、作者、简介等。下面是一些简单的方法&#xff0c;可以帮助你创建出与众不同的书单背景图和视频。 创意…

kubernetes安全检测工具-kube-bench

一、kube-bench基础介绍 kube-bench是基于go语言开发、一款针对kubernetes进行安全检测的工具&#xff0c;主要是检测kubernetes集群的各个组件的配置&#xff0c;确认配置文件是否符合安全基线标准&#xff0c;输出检测报告&#xff0c;并给出修复建议&#xff0c;从而使kuber…

Jetson nano嵌入式平台配置ip记录

背景 Jetson nano平台使用千兆网和PC连接时没有ip地址&#xff0c;在ubuntu的终端输入ifconfig显示eh0未设置ip&#xff0c;需要先在nano平台上配置ip地址&#xff0c;然后PC通过千兆网远程控制该平台。 配置ip 使用终端进入到network文件夹中&#xff0c; cd /etc/network…

C++之list

目录 一、关于list 二、list相关函数 三、相关函数的使用 1、构造函数 2、push_back 3、迭代器 4、push_front 5、pop_back 6、insert 7、erase 关于迭代器失效问题 8、splice 9、remove 10、sort 一、关于list list和string、vector一样&#xff0c;都是容器&am…

领域驱动设计:微服务的各种边界

文章目录 演进式架构微服务还是小单体&#xff1f;微服务边界的作用 在用 DDD 进行微服务设计时&#xff0c;我们可以通过事件风暴来确定领域模型边界&#xff0c;划定微服务边界&#xff0c;定义业务和系统运行边界&#xff0c;从而保证微服务的单一职责和随需而变的架构演进能…

【Python】简记操作:Centos安装Python3虚拟环境-virtualenvwrapper

安装 pip3 install virtualenvwrapper 安装时报错&#xff1a;ERROR: Can not execute setup.py since setuptools is not available in the build environment. 原因&#xff1a; setuptools版本过低&#xff1b; 解决&#xff1a;升级setuptools # 升级setuptools版本 pi…

创邻科技,位居IDC MarketScape中国图数据库市场领导者类别

图数据库&#xff0c;正进入市场发展的新阶段。 随着中国经济社会数字化转型加速&#xff0c;数据成为新型生产要素。如何存储并管理海量数据&#xff0c;挖掘数据价值&#xff0c;打破原有增长天花板&#xff0c;成为企业重塑商业价值的关键。存量经济时代更需要深层关系挖掘&…

【深度学习】- NLP系列文章之一文本表示

系列文章目录 文本分类与词嵌入表示RNN、LSTM、GRU三种方式处理文本分类问题评论情绪分类 还是得开个坑&#xff0c;最近搞论文&#xff0c;使用lstm做的ssd的cache prefetching&#xff0c;意味着我不能再划水了。 文章目录 系列文章目录1. 文本数据表示法与词嵌入1.1 文本是…

蓝牙技术|8月公共充电桩环比增加6.1万台,蓝牙充电桩持续增长

中国充电联盟发布 2023 年 8 月全国电动汽车充换电基础设施运行情况。公共充电基础设施运行情况&#xff1a;2023 年 8 月比 7 月公共充电桩增加 6.1 万台&#xff0c;8 月同比增长 39.9%。截至 2023 年 8 月&#xff0c;联盟内成员单位总计上报公共充电桩 227.2 万台&#xff…