DAY6,C++(将顺序栈,顺序循环队列定义成模板类);

news2024/11/25 0:41:43

1.将顺序栈定义成模板类;​​​​​​

顺序栈模板代码--- 
#include <iostream>

using namespace std;

template<typename T>
class Stack
{
private:
    T *data;  //指向堆区空间
    int top;  //记录栈顶位置

public:
    Stack();  //无参构造
    Stack(T size);  //有参构造
    ~Stack();  //析构函数
    bool Empty();  //判空
    bool Full(T size);  //判满
    T get_elemsize();  //返回容纳的元素数
    void Push(T size,T elem);  //入栈
    void Pop();  //出栈
    void Output();  //遍历栈内元素
    T get_top();  //访问栈顶元素

    //重载=运算符(一个Stack对象赋值给另一个Stack对象)
    Stack<T> &operator =(const Stack<T> &R)
    {
        if(this == &R)
            return *this;

        delete [] data;
        data = new T[R.top+1];

        for(int i=0; i<=R.top; i++)
            data[i] = R.data[i];
        top = R.top;

        return *this;
    }

};

//无参构造
template<typename T>
Stack<T>::Stack():data(new T[10]),top(-1) {}

//有参构造
template<typename T>
Stack<T>::Stack(T size):data(new T[size]),top(-1) {}

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

//判空
template<typename T>
bool Stack<T>:: Empty()
{
    return top==-1;
}

//判满
template<typename T>
bool Stack<T>:: Full(T size)
{
    return top==size-1;
}

//返回容纳的元素数
template<typename T>
T Stack<T>::get_elemsize()
{
    return top+1;
}

//入栈
template<typename T>
void Stack<T>::Push(T size,T elem)
{
    if(Full(size) == true)
        return;
    data[++top] = elem;
}

//出栈
template<typename T>
void Stack<T>::Pop()
{
    if(Empty() == true)
        return;
    top--;
}

//遍历栈内元素
template<typename T>
void Stack<T>::Output()
{
    if(Empty() == true)
        return;
    for(int i=0; i<=top; i++)
    {
        cout<<data[i]<<" ";
    }
    cout<<endl;
}

//访问栈顶元素
template<typename T>
T Stack<T>::get_top()
{
    if(Empty() == true)
        return 0;
    return data[top];
}


int main()
{
    int size;
    cout<<"输入栈的大小>>> ";
    cin>>size;

    Stack<int> s1(size);  //有参构造

    char ch;
    int elem;
    do         //入栈
    {
        cout<<"输入入栈元素>>> ";
        cin>>elem;
        s1.Push(size,elem);

        if(s1.Full(size) == true)
        {
            cout<<"栈满,退出入栈"<<endl;
            break;
        }

        cout<<"继续入栈? y/Y ";
        cin>>ch;
    }while(ch == 'y' || ch =='Y');

    s1.Output();  //遍历

    s1.Pop();  //弹出栈顶元素
    cout<<"弹出栈顶元素后>>> ";
    s1.Output();  //遍历

    cout<<"容纳的元素数>>> "<<s1.get_elemsize()<<endl<<endl;

    cout<<"获取栈顶元素>>> "<<s1.get_top()<<endl;
    cout<<endl;

    Stack<int> s2;
    s2 = s1;       //重载=
    cout<<"赋值后s2>>> ";
    s2.Output();  //遍历s2

    return 0;
}

 

2.将循环顺序队列定义成模板类;

循环顺序队列模板代码---
#include <iostream>

using namespace std;

#define MAXSIZE 6

template<typename T>
class Queue
{
private:
    T *data;  //指向堆区空间
    int front;  //记录队头
    int rear;  //记录队尾

public:
    Queue();  //无参构造
    Queue(T size);  //有参构造
    ~Queue();  //析构函数
    bool Empty();  //判空
    bool Full(T size);  //判满
    T get_elemsize(T size);  //返回容纳的元素数
    void Push(T size,T elem);  //入队
    void Pop(T size);
    void Output(T size);  //遍历队内元素
    T get_firstelem();  //访问第一个元素
    T get_endelem();  //访问最后一个元素

    //重载=运算符(一个Queue对象赋值给另一个Queue对象)
    Queue<T> &operator =(const Queue<T> &R)
    {
        if(this == &R)
            return *this;

        delete [] data;
        data = new T[MAXSIZE];

        for(int i=front; i != R.rear; i=(i+1)%MAXSIZE)
            data[i] = R.data[i];
        front = R.front;
        rear = R.rear;

        return *this;
    }

};

template<typename T>
Queue<T>::Queue():data(new T[MAXSIZE]),front(0),rear(0) {}  //无参构造

template<typename T>
Queue<T>::Queue(T size):data(new T[size]),front(0),rear(0) {}  //有参构造

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

template<typename T>
bool Queue<T>::Empty()  //判空
{
    return front==rear;
}

template<typename T>
bool Queue<T>::Full(T size)  //判满
{
    return front == (rear+1)%size;
}

template<typename T>
T Queue<T>::get_elemsize(T size)  //返回容纳的元素数
{
    return (size-front+rear)%size;
}

template<typename T>
void Queue<T>::Push(T size,T elem)  //入队
{
    if(Full(size) == true)
        return;
    data[rear] =  elem;
    rear = (rear+1)%size;
}

template<typename T>
void Queue<T>::Pop(T size)          //出队
{
    if(Empty() == true)
        return;
    front = (front+1)%size;
}

template<typename T>
void Queue<T>::Output(T size)   //遍历队内元素
{
    if(Empty() == true)
        return;
    for(int i=front; i != rear; i=(i+1)%size)
    {
        cout<<data[i]<<" ";
    }
    cout<<endl;
}

//访问第一个元素
template<typename T>
T Queue<T>::get_firstelem()
{
    return data[front];
}

//访问最后一个元素
template<typename T>
T Queue<T>::get_endelem()
{
    return data[rear-1];
}

int main()
{

    int size;
    cout<<"输入队列的大小>>> ";
    cin>>size;

    Queue<int> s1(size);  //有参构造

    char ch;
    int elem;
    do         //入队
    {
        cout<<"输入入队元素>>> ";
        cin>>elem;
        s1.Push(size,elem);

        if(s1.Full(size) == true)
        {
            cout<<"队满,退出入队"<<endl;
            break;
        }

        cout<<"继续入队? y/Y ";
        cin>>ch;
    }while(ch == 'y' || ch =='Y');

    s1.Output(size);  //遍历

    s1.Pop(size);  //弹出队尾元素
    cout<<"弹出一个队尾元素后>>> ";
    s1.Output(size);  //遍历

    cout<<"容纳的元素数>>> "<<s1.get_elemsize(size)<<endl<<endl;
    cout<<"获取第一个元素>>> "<<s1.get_firstelem()<<endl;
    cout<<"获取最后一个元素>>> "<<s1.get_endelem()<<endl;
    cout<<endl;

    Queue<int> s2;
    s2 = s1;       //重载=
    cout<<"赋值后s2>>> ";
    s2.Output(size);  //遍历s2


    return 0;
}

 

3.今日c++知识脑图;

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

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

相关文章

子网划分路由网卡安全组

1."IPv4 CIDR" "IPv4 CIDR" 是与互联网协议地址&#xff08;IP address&#xff09;和网络的子网划分有关的概念。 - "IPv4" 代表 "Internet Protocol version 4"&#xff0c;也就是第四版互联网协议&#xff0c;这是互联网上最广泛使…

动态规划入门第4课,经典DP问题3 ----公共最长子序列

练习 第1题 最长公共子串 查看测评数据信息 给出2个小写字母组成的字符串&#xff0c;求它们最长的公共子串的长度是多少&#xff1f; 例如&#xff1a;”abcdefg” 与”xydoeagab”。有最长的公共子串”deg”&#xff0c; 答案为&#xff1a;3。 输入格式 第一行&#xff…

Java并发编程学习笔记(一)线程的入门与创建

一、进程与线程 认识 程序由指令和数据组成&#xff0c;简单来说&#xff0c;进程可以视为程序的一个实例 大部分程序可以同时运行多个实例进程&#xff0c;例如记事本、画图、浏览器等少部分程序只能同时运行一个实例进程&#xff0c;例如QQ音乐、网易云音乐等 一个进程可以…

【密码学】三、DES

DES 1、DES的加密过程2、初始置换3、16轮迭代变换过程3.1 扩展变换/位选择函数E3.2 S盒代换3.3P盒置换 4、初始逆置换5、密钥扩展5.1 选择置换PC_15.2选择置换PC_2 6、DES的解密过程7、多重DES 美国正式公布实施的DES是一个众所周知的分组密码&#xff0c;其 分组长度是64bit&…

Redis 缓存机制介绍

.Redis 缓存 缓存&#xff08;cache&#xff09;&#xff0c;原始意义是指访问速度比一般随机存取存储器&#xff08;RAM&#xff09;快的一种高速存储器&#xff0c;通常它不像系统主存那样使用 DRAM 技术&#xff0c;而使用昂贵但较快速的 SRAM 技术。缓存的设置是所有现代计…

arm点灯

.text .global _start _start: /**********LED1点灯**************/RCC_INIT:LDR R0,0X50000A28LDR R1,[R0]orr R1,R1,#(0x1<<4)orr R1,R1,#(0X1<<5)STR R1,[R0] LED1_INIT:/**/LDR R0,0X50006000LDR R1,[R0]and R1,R1,#(~(0X3<<20))orr R1,R1,#(0x1<<…

windows下载pytorch gpu时遇见的问题以及解决方案

一些很奇怪的问题 使用官方命令下载失效离线下载之后使用pip安装又md报错了 使用官方命令下载失效 这是官方的下载命令&#xff0c;我在运行这个命令的时候咋的都报错&#xff0c;真的无语。 报错信息如下&#xff08;当时没截图&#xff0c;我再创建个新环境运行此命令给大家…

13.2 【Linux】帐号管理

13.2.1 新增与移除使用者&#xff1a; useradd, 相关配置文件, passwd,usermod, userdel 我们登陆系统时会输入&#xff08;1&#xff09;帐号与 &#xff08;2&#xff09;密码&#xff0c; 所以创建一个可用的帐号同样的也需要这两个数据。那帐号可以使用 useradd 来新建使用…

深度剖析数据在内存中的储存

深度剖析数据在内存中的储存 整形在内存的储存大小端浮点型在内存中的存储浮点数在内存中存储规则 整形在内存的储存 #include <stdio.h> int main() {int a 0x11223344; }将整形a赋值为0x11223344 然后监视内存的地址 将地址在内存调试窗口中搜索&#xff0c;可以找到…

【MySQL】SQL性能分析 (七)

&#x1f697;MySQL学习第七站~ &#x1f6a9;本文已收录至专栏&#xff1a;MySQL通关路 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ 假如我们需要对SQL进行优化&#xff0c;我们就必须对他足够的了解&#xff0c;比如 对哪一类SQL进行优化&#xff08;增删改查…

【计算机组成原理】24王道考研笔记——第二章 数据的表示和运算

第二章 数据的表示和运算 一、数值与编码 1.1 进制转换 任意进制->十进制&#xff1a; 二进制<->八进制、十六进制&#xff1a; 各种进制的常见书写方式&#xff1a; 十进制->任意进制&#xff1a;&#xff08;用拼凑法最快&#xff09; 真值&#xff1a;符合人…

【C/C++】类之间的横向关系

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

Qt曲线绘制-QChart使用(一)

最近打算研究一下qt绘制曲线图&#xff0c;以前项目中绘制曲线图都是纯painter画的&#xff0c;查了一下才发现qt关于曲线的图绘制有自带的qchart&#xff0c;还有第三方的qcustomplot、qwt、echarts等等&#xff0c;先研究QChart&#xff0c;QChart是Qt5.7之后才有的并且安装q…

基于antd@5.x封装Form.List组件

基于antd5.x封装Form.List组件 使用案例 const initFormState {formList1: [{start: 测试,end: 100,},{start: abc,end: value,},],formList2: [{start: 测试2,end: 6,},{start: vxcv,end: jksdhfjk,},], };<Formform{form}onFinish{onFinish}autoCompleteoffinitialValue…

源码对接微软Azure OpenAI 规范注意点

众所周知&#xff0c;我们是访问不通OpenAI官方服务的&#xff0c;但是我们可以自己通过代理或者使用第三方代理访问接口 现在新出台的规定禁止使用境外的AI大模型接口对境内客户使用&#xff0c;所以我们需要使用国内的大模型接口 国内的效果真的很差&#xff0c;现在如果想合…

【RabbitMQ】RabbitMQ集群搭建(Docker版本)

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

react+redux异步操作数据

reactredux异步操作数据 redux中操作异步方法&#xff0c;主要是&#xff1a; 1、借助createAsyncThunk()封装异步方法&#xff1b;2、通过extraReducers处理异步方法触发后的具体逻辑&#xff0c;操作派生的state 1、异步操作的slice import { createSlice, createAsyncThunk…

关于Docker的基本概念和使用

关于Docker的基本概念和使用 一、Docker 概述1、Dcker的概念2、容器的优势3、Docker与虚拟机的区别4、容器在内核中支持2种重要技术5、Docker核心概念 二、安装 Docker1、安装依赖包2、设置阿里云镜像源3、安装 Docker-CE并设置为开机自动启动3、查看 docker 版本信息4、docker…

【蓝图】p36-p39蓝图通信、自定义事件、类型转换、角色移动速度、触发加速

p36-p39蓝图通信、自定义事件、类型转换、角色移动速度、触发加速 p36蓝图通信和自定义事件蓝图通信自定义事件 p37类型转换加速功能类型转换 p38创建自定义事件p39实现触发加速 p36蓝图通信和自定义事件 蓝图通信 在Unreal Engine&#xff08;UE&#xff09;中&#xff0c;蓝…

【开源项目】低代码数据可视化开发平台go-view

数据可视化开发平台go-view 基本介绍 GoView 是一个Vue3搭建的低代码数据可视化开发平台&#xff0c;将图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 它的技术栈为&#xff1a;Vue3 TypeScript4 Vite2 NaiveUI ECharts5 Axios Pinia2 Plop…