C++ 栈和队列的简单封装(9.3)

news2024/11/13 19:33:38

1.栈的封装

代码

#include <iostream>

using namespace std;

typedef int datatype;
class Stack
{
private:
    datatype *data;
    int max_size;       //栈的大小
    int the_top;        //栈顶
public:
    Stack()
    {
        data= new int[50];
        max_size = 50;
        the_top = -1;
    }
    Stack(int a)
    {
        data= new int[a];
        max_size = a;
        the_top = -1;
    }
    ~Stack()
    {
        delete[] data;
    }

    //访问栈顶元素
    datatype &top()
    {
        return *(data+the_top);
    }
    //判空
    bool empty()
    {
        return the_top==-1;
    }
    //求栈的大小
    int size()
    {
        return the_top+1;
    }
    //插入元素
    void push(datatype e)
    {
        if(the_top==max_size-1)
        {
            cout<<"栈满,入栈失败"<<endl;
        }else
        {
            data[++the_top]=e;
        }
    }
    //删除元素
    void pop()
    {
        if(the_top==-1)
        {
            cout<<"删除失败"<<endl;
        }else
        {
            the_top--;
        }
    }
    //赋值运算符
    Stack &operator=(const Stack& other)
    {
        //自赋值检查
        if(this==&other)
        {
            return *this;
        }
        //释放旧数据
        delete [] data;
        data = nullptr;
        the_top = -1;
        //分配新数据
        max_size = other.max_size;
        data = new datatype[max_size];

        //复制数据
        the_top = other.the_top;
        for (int i = 0; i <= the_top; ++i)
        {
            data[i] = other.data[i];
        }

        // 返回当前对象的引用
        return *this;
    }

    void show()const
    {
        if(the_top==-1)
        {
            cout << "栈为空" << endl;
            return;
        }else
        {
            cout << "栈内容(从栈底到栈顶): ";
            for (int i = the_top; i >= 0; --i)
            {
                cout << data[i] << " ";
            }
            cout << endl;
        }
    }

};

int main()
{
    //插入演示
    Stack s1(10);
    s1.push(1);
    s1.push(2);
    s1.push(3);
    s1.show();
    cout<<"******************"<<endl;

    //访问栈顶元素演示
    cout<<s1.top()<<endl;
    cout<<"******************"<<endl;

    //求栈的大小演示
    cout<<s1.size()<<endl;
    cout<<"******************"<<endl;

    //删除演示
    s1.pop();
    s1.show()
;    cout<<"******************"<<endl;

    //赋值=演示
    Stack s2(5);
    s2=s1;
    s2.show();
    cout<<"******************"<<endl;
    return 0;
}

 运行结果:

 

2.队列的封装

 代码:

#include <iostream>

using namespace std;

typedef int datatype; // 队列中存储的数据类型

class Queue
{
private:
    datatype* data;
    int front;          // 队首元素的索引
    int rear;           // 队尾元素的下一个位置的索引
    int max_size;       // 队列的最大容量
    int c_size;         // 队列当前的大小
public:
    //有参构造
    Queue(int n):front(0),rear(0),max_size(n),c_size(0)
    {
        data = new datatype[max_size];
    }
    //析构函数
    ~Queue()
    {
        delete [] data;
    }
    //访问第一个元素 my_front
    datatype my_front()
    {
        if(empty())
        {
            cout<<"队列为空"<<endl;
            return 0;
        }else
        {
            return data[front];
        }
    }
    //访问最后一个元素 back
    datatype back()
    {
        if(empty())
        {
            cout<<"队列为空"<<endl;
            return 0;
        }else
        {
            return data[(rear - 1 + max_size) % max_size]; // 循环队列处理
        }
    }
    //判空 empty
    bool empty()
    {
        return c_size==0;
    }
    //返回容纳的元素数 size
    int size()const
    {
        return c_size;
    }
    //队尾插入元素 push
    void push(datatype e)
    {
        if(c_size == max_size)  //判满
        {
            cout<<"队列已满"<<endl;
        }else
        {
          data[rear] = e;
          rear = (rear + 1) % max_size; // 循环队列处理
          ++c_size;
        }
    }
    //删除首个元素 pop
    void pop()
    {
        if(empty())
        {
            cout<<"队列为空"<<endl;
        }else
        {
            front = (front + 1) % max_size; // 循环队列处理
            --c_size;
        }
    }
    //赋值 operator=
    Queue& operator=(const Queue& other)
    {
        if (this != &other)
        {
            delete[] data; // 删除旧数据
            max_size = other.max_size;
            data = new datatype[max_size];

            // 复制数据
            c_size = other.c_size;
            front = other.front;
            rear = other.rear;
            for (int i = 0; i < c_size; ++i)
            {
                data[(front + i) % max_size] = other.data[(other.front + i) % other.max_size];
            }
        }
        return *this;
    }

    //展示函数
    void show()const
    {
        if(c_size==0)
        {
            cout<<"队列为空"<<endl;
            return;
        }else
        {
            cout << "队列内容: ";
            for (int i = 0; i < c_size; i++)
            {
                cout<<data[(front +i)% max_size]<<" ";
            }
            cout << endl;
        }
    }
};

int main()
{
    Queue q1(5);
    //插入演示
    q1.push(1);
    q1.push(2);
    q1.push(3);
    q1.show();
    cout<<"******************"<<endl;

    //访问第一个元素
    cout<<q1.my_front()<<endl;
    cout<<"******************"<<endl;

    //访问最后一个元素
    cout<<q1.back()<<endl;
    cout<<"******************"<<endl;

    //返回size大小演示
    cout<<q1.size()<<endl;
    cout<<"******************"<<endl;

    //删除演示
    q1.pop();
    q1.show();
    cout<<"******************"<<endl;

    //赋值=演示
    Queue q2(6);
    q2=q1;
    q2.show();
    cout<<"******************"<<endl;

    return 0;
}

运行结果:

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

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

相关文章

一个好用的Maven依赖冲突解决插件:Maven Helper

在项目开发&#xff0c;或项目Maven需要新增依赖、项目依赖组件升级时&#xff0c;经常会出现添加后&#xff0c;因为各个模块中有相同的依赖、不同的版本而导致依赖冲突&#xff0c;从而导致项目启动不起来&#xff0c;这种冲突非常恶心&#xff0c;因为是传递依赖所以会看不出…

【数据推荐】我国省市县三级的人口受教育状况数据(分年龄\性别\户籍)

人口数据是我们在各项研究中都经常使用的数据。之前我们为大家分享过基于《2020中国人口普查分县资料》整理的全国范围的第七次人口普查人口数据&#xff0c;具体包括如下8个分表&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff1a; 表1&#xff1a;我国省市县三…

大二暑假去龙旗科技(上海)做了两个月软件测试实习生,讲讲我的经历和感受

目录 1.为什么选择软件测试 2.入职&#xff0c;辞职流程以及实习工作内容 3.行业选择和个人感悟 新的学期开始了兄弟们&#xff0c;我也已经断更几个月了&#xff0c;这几个月我并没有摆烂&#xff0c;我选择了备考蓝桥杯&#xff0c;复习期末&#xff0c;暑假出去实习。结果…

SpringDataJPA系列(5)@Query应该怎么用?

SpringDataJPA系列(5)Query应该怎么用&#xff1f; 之前说到过&#xff0c;DMQ查询策略有两种&#xff1a;方法命令和Query注解的方式。为什么需要两种呢&#xff1f;它们分别适用的场景是怎么样的&#xff1f; Query使用 定义一个通过名字查询用户的方法 以下是测试方法&…

将泛型和函数式编程结合,竟然会让代码这么优雅!

但这种方式却太表象了&#xff0c;没有灵魂和深度&#xff0c;过去的那些日子&#xff0c;我感觉自己的编程水平也就限于把重复的代码抽一抽&#xff0c;&#xff08;如下图所示一样&#xff09;&#xff0c;甚至觉得代码优化不就是这样吗&#xff0c;这样的状态一直维持很久。…

Linux多线程——利用C++模板对pthread线程库封装

文章目录 线程封装主要框架线程启动线程等待其他信息 测试函数 线程封装 我们之前介绍过pthread的线程库&#xff0c;这个线程库主要是基于C语言的void*指针来进行传参和返回 我们使用C的模板对其封装可以让他的使用更加方便&#xff0c;并且经过测试可以让我们更加直观的了解…

DPDK基础入门(二):Cache与大页优化

Cache简介 目前Cache主要由三级组成: L1 Cache, L2 Cache和Last Level Cache(LLC)。 L1最快&#xff0c;但容量小&#xff0c;可能只有几十KB。LLC慢&#xff0c;但容量大&#xff0c;可能多达几十MB。 L1和L2 Cache一般集成在CPU内部。另外,&#xff0c;L1和L2 Cache是每个处…

【2024】Datawhale X 李宏毅苹果书 AI夏令营 Task3

本文是关于李宏毅苹果书”第2章 实践方法论“学习内容的记录。 模型在测试集上表现不佳&#xff0c;可能是因为模型没有充分学习训练集。模型不能充分学习训练集的原因&#xff1a; 模型偏差优化问题过拟合不匹配 一、模型偏差 模型偏差是指&#xff1a;由于模型过于简单&a…

网站如何针对不同的DDOS进行防御?

建设网站租用服务器是多数企业及个人的选择&#xff0c;一个安全稳定的服务器对网站的重要性无需再赘述。要保证服务器租用的安全和稳定&#xff0c;除了需要服务器自身有强大的硬、软件基础之外&#xff0c;还需要防范外部的一些因素&#xff0c;常见的就是各种网络攻击&#…

Linux 上如何做MySQL数据备份

目录 SQL备份脚本创建crontabcrontab命令总结查看特定目录中的周期性任务 crontab&#xff08;cron table 的缩写&#xff09;是 Unix/Linux 系统上用于设置周期性被执行的任务的工具。它允许用户定义需要在特定时间&#xff08;比如每天凌晨、每周的某个时间等&#xff09;自动…

驭势科技研究成果入选学术顶会IROS 2024

近日&#xff0c;驭势科技团队关于自动驾驶车辆定位算法的最新研究成果《LiDAR-based HD Map Localization using Semantic Generalized ICP with Road Marking Detection》&#xff0c;创造性地解决了基于LiDAR的实时路标检测和高精地图配准所带来的挑战&#xff0c;成功入选国…

汇川技术|KingIOServer与AC810PLC通过ModbusTCP通讯测试

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 最近有个项目用亚控的KingSCADA软件开发SCADA系统&#xff0c;需要和汇川的AC810PLC进行通讯&#xff1b; 本节测试亚控的采集软件KingIOServer与汇川的AC810PLC的通讯测试。 以下为测试笔记。 01 效果演示 测试过程…

3个苹果锁屏密码解锁方法,帮你快速解决密码忘记的烦恼!

苹果手机锁屏密码忘记了是一件很常见的问题&#xff0c;但也是一件让人头疼的事情。如果你遇到了这样的问题&#xff0c;不要着急&#xff0c;因为有很多方法可以帮助你解锁iPhone。下面我们将介绍四种简单的方法来解锁iPhone。 一、使用密码解锁工具 iphone忘记了密码怎么解锁…

iconfont图标字体库详细介绍

概述 图标库在前端开发中应用十分广泛&#xff0c;图标库不仅会丰富美化界面的展示&#xff0c;语义化的图标库更能简洁明了地向用户传达某些信息&#xff0c;比如功能的特性和作用&#xff0c;引导用户&#xff0c;极大提高系统的易用性。在没有 UI 设计师的情况下&#xff0…

【C++】手动实现队列的封装(C++)

目录 源代码&#xff1a; 输出结果如下&#xff1a; 实现以下封装 源代码&#xff1a; #include <iostream>using namespace std;class Queue { private:int* arr; // 队列的动态数组int front; // 队列头部元素的索引int rear; // 队列尾部元素的索引in…

新版某数字壳脱壳,过frida检测,及重打包

目录 脱壳 寻找特征& frida hook 过frida检测 修复dex 重打包 修改smail 去签名校验 正文 大家好&#xff0c;我是小生&#xff0c;这次的app是一个国内某计划app, 功能相当全&#xff0c;界面也很美观&#xff0c;很实用&#xff0c;这个app我很欣赏。总共花了有…

【SQL】Delete使用

目录 语法 需求 示例 分析 代码 语法 DELETE删除表中所需内容 删除表中满足特点条件的行&#xff1a;DELETE FROM 表名 WHERE 条件; 删除表中所有行&#xff1a;DELETE FROM 表名; WHERE子句 WHERE子句用于指定从表中选取记录的条件。允许筛选数据&#xff0c;只返回满足…

【文献精读】基于驱动力表的无人车终端无约束预测纵向控制(TVT)

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

ElasticSearch学习笔记(六)自动补全、拼音分词器、RabbitMQ实现数据同步

文章目录 前言11 自动补全11.1 拼音分词器11.2 自定义分词器11.3 自动补全查询 12 数据同步12.1 实现方案12.1.1 同步调用12.1.2 异步通知12.1.3 监听binlog 12.2 异步通知实现数据同步12.2.1 声明交换机和队列12.2.2 发送MQ消息12.2.3 接收MQ消息并操作ES 前言 ElasticSearch…

数据结构————单向链表

头插&#xff1a; 尾插&#xff1a; 头删&#xff1a; 尾删&#xff1a;