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

2023-09-13 20:44:24

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

更多推荐

Vivado中增加源文件界面中各选项的解释

文章目录官方解释结论总结验证增加单个.v文件增加文件夹Copysourcesintoproject参考文献本文对Vivado中增加源文件界面AddorCreateDesignSources和AddorCreateSmulatonsources中的选项ScanandaddRTLincludefilesintoprojec

yolov5自动训练/预测-小白教程

文章目录引言一、配置参数设置1、数据参数配置2、模型训练参数配置3、模型预测参数配置二、一键训练/预测的sh介绍1、训练sh文件(train.sh)介绍2、预测sh文件(detect.sh)介绍三、本文训练main代码解读1、训练main函数解读2、数据加工与参数替换四、本文预测main代码解读1、训练main函数解读

安卓系列机型 框架LSP 安装步骤 支持多机型 LSP框架通用安装步骤【二】

​​​​​​安卓玩机教程---全机型安卓4----安卓12框架xpedxlsp安装方法【一】低版本可以参考上个博文了解相关安装方法。LSP框架优点简单来说装lsp框架的优点在于可以安装各种模块。包括但不限于系统优化加速游戏开挂等等的模块。大致相当于电脑的扩展油猴Lsposed框架是在Edposed框架的基础上进行改良的

【云原生 | 57】Docker三剑客之Docker Swarm֯使用其他服务发现后端

🍁博主简介:🏅云计算领域优质创作者🏅2022年CSDN新星计划python赛道第一名🏅2022年CSDN原力计划优质作者🏅阿里云ACE认证高级工程师🏅阿里云开发者社区专家博主💊交流社区:CSDN云计算交流社区欢迎您的加入!目录1.使用文件2.其他发现服务后端3.地址和端口的范围匹配👑👑👑结束语👑�

云原生之使用Docker部署SSCMS内容管理系统

云原生之使用Docker部署SSCMS内容管理系统一、SSCMS介绍二、本地环境介绍2.1本地环境规划2.2本次实践介绍三、本地环境检查3.1检查Docker服务状态3.2检查Docker版本3.3检查dockercompose版本四、下载SSCMS镜像五、部署SSCMS内容管理系统5.1创建SSCMS容器5.2检查S

制作学生查询小程序

学生个人成绩查询小程序,一款助力教师实时了解学生学习情况的便捷工具。本文将为您揭秘它的制作过程,并提供实用的建议。然而,简便易用的方法莫过于选择现有的工具。许多教师都偏爱使用易查分来快速创建查分网站。与传统的独立开发方式不同,易查分免去了高昂的定制费用和计算机技术要求。只需简单操作电脑,教师们就能通过上传成绩表格轻松制

家政服务小程序上门服务小程序预约上门服务维修保洁上门服务在线派单技师入口

套餐一:源码=1500元套餐二:全包服务包服务器+域名+认证小程序+搭建+售后=2000元主要功能:1、服务商入驻支持个人或企业入驻成为平台服务商;2、发布商品入驻服务商后,可以发布服务商品,用户可以在线下单,预约服务;3、发布需求用户可以发布一口价或竞价需求,服务商抢-单,用户可以选择服务商下单服务;4、服务商等级支

家族小程序:连接亲情的技术纽带

家族小程序是一种基于互联网技术的应用程序,旨在为家族成员提供便捷的沟通与分享平台。它通过集成了多种功能模块,如家族动态、相册分享、日程安排等,实现了家庭成员之间的实时互动和信息共享。本文将深入探讨家族小程序的原理和功能,分析其对家庭关系的影响,并就其发展趋势进行思考,旨在为读者提供专业且有深度的见解,进一步了解家族小程

Android 修复在 Settings 首页,按键盘方向键逐个单选

Android修复在Settings首页,按键盘方向键逐个单选问题现象问题分析解决办法问题现象在Settings主界面,按键盘方向键上下会直接整个选中,无法单条选中变色,而在二级页面中按方向键上下是正常的。没有遥控器可以通过adb指令模拟下键adbshellinputkeyevent20问题分析Settings中都是用

win部署CRM

win部署crm)1.phpstudy2.composer3.代码4.其他配置周末锴哥让我帮他部署了一个CRM,写个教程,方便之后他用。锴哥用的是NxCrm,先把代码下下来。1.phpstudy1.首先是下载小皮面板,配置php的环境。这里面下载了php8.2.9nts版本的,然后把原来的7版本的就删掉了。2.将代码解

MyBatis字段名和属性名不一样的解决方案

一、给字段起别名,保持和属性名一样<!--List<Emp>getAllEmp();--><selectid="getAllEmp"resultType="Emp">selecteid,emp_nameempName,age,sex,emailfromt_emp</select>如上面的SQL语句将emp_name取别

热文推荐