C++第六讲

news2025/1/12 1:52:27

思维导图

顺序栈定义成模板类

/* 
   ---------------------------------
    @author:YoungZorn
    created on 2023/7/22 16:23.
   ---------------------------------
*/
#include<iostream>

using namespace std;

template<typename T>
class my_stack {
private:
    T *ptr;         //执行堆区空间,栈首地址(数组首地址)
    int top;            //记录栈顶元素

public:
    //构造函数
    my_stack() : ptr(new T[10]), top(-1) {}

    //析构函数
    ~my_stack() { delete[] ptr; }

    //判空函数(empty)
    bool isEmpty() {
        if (top == -1 || ptr == nullptr) {
            return true;
        } else {
            return false;
        }
    }
    //判满函数(full)
    bool isFull() {
        if (top >= 9) {
            return true;
        } else {
            return false;
        }
    }
    //入栈函数(push)
    bool push(T item) {
        if (isFull()) {
            cout << "Full stack" << endl;
            return false;
        }
        ptr[++top] = item;
        return true;
    }
    //出栈函数(pop)
    T pop() {
        if (isEmpty()) {
            return false;
        }
        return ptr[top--];
    }
    //遍历栈
    void output() {
        if (isEmpty()) {
            cout << "Empty stack" << endl;
            return;
        }
        for (int i = 0; i <= top; i++) {
            cout << ptr[i] << " ";
        }
        cout << endl;
    }

    //获取栈顶元素的引用(top)
    T &getTop(){
        if (isEmpty()){
            throw "empty stack";
        }
        return ptr[top];
    }

    //返回栈中元素个数size
    int size(){
        if (isEmpty())
            return 0;
        return top;
    }

    //运算符重载 ( = )
    my_stack & operator=(const my_stack & R){
        if (this == &R){
            return *this;
        }

        delete [] ptr;

        //深拷贝栈
        top = R.top;
        ptr = new T[10];

        for (int i = 0; i <= top; i++) {
            ptr[i] = R.ptr[i];
        }
        return *this;
    }
};

int main() {
    my_stack<double> stack1;
    stack1.push(1.3);
    stack1.push(2.4);
    stack1.push(3.1);
    stack1.push(8.1);
    stack1.push(5.1);
    stack1.output();
    stack1.pop();
    stack1.output();
    cout<<"top: "<<stack1.getTop()<<endl;

    my_stack<double> stack2;
    stack2.push(1.2);
    stack2.push(1.1);
    stack2.push(3.1);
    stack2 = stack1;
    stack2.output();
    stack2.pop();
    stack2.output();
    cout<<"top: "<<stack2.getTop()<<endl;

    return 0;
}

循环顺序队列定义成模板类 

/* 
   ---------------------------------
    @author:YoungZorn
    created on 2023/7/22 16:31.
   ---------------------------------
*/
#include<iostream>

using namespace std;

template<typename T>
class seqQueue{
private:
    T *data;
    int front;
    int rear;
    int MAXSIZE;

public:
    //无参构造
    seqQueue(){}

    //有参构造
    seqQueue(int M):front(0),rear(0),MAXSIZE(M+1){
        data = new T(MAXSIZE);  //调用类T的构造函数来创建一个T类型的对象
    }

    //析构函数
    ~seqQueue(){delete [] data;}

    //判空
    bool isEmpty(){
        return front == rear;
    }

    //判满
    bool isFull(){
        return front == (rear+1)%MAXSIZE;
    }

    //出队(pop)
    T dequeue(){
        if (isEmpty())
            return;
        T temp = data[front];
        front = (front+1)%MAXSIZE;
        return temp;
    }

    //入队(push)
    void enqueue(const T& temp){
        if (isFull())
            return;
        data[rear] = temp;
        rear = (rear+1)%MAXSIZE;
    }

    //输出
    void output(){
        if (isEmpty())
            return;
        for (int i = front; i < rear; i = (i+1)%MAXSIZE) {
            cout<<"data["<<i<<"] = "<<" "<<data[i]<<endl;
        }
    }

    //队列中元素的个数(size)
    int elemCount(){
        if (isEmpty())
            return 0;
        return (MAXSIZE-front+rear)%MAXSIZE;
    }

    //运算符重载 ( = )
    seqQueue& operator=(const seqQueue &other){
        if (this == &other)
            return *this;

        //释放当前对象的缓存
        delete [] data;

        //深拷贝循环队列
        MAXSIZE = other.MAXSIZE;
        front = other.front;
        rear = other.rear;
        data = new T(MAXSIZE);

        int i = front;
        while (i != rear){
            data[i] = other.data[i];
            i = (i+1)%MAXSIZE;
        }
        return *this;
    }

    //front访问第一个元素
    T elemFront(){
        if (isEmpty())
            return T();
        return data[front];
    }

    //back访问最后一个元素
    T elemRear(){
        if (isEmpty())
            return T();
        return data[rear-1];
    }
};

int main(){
    seqQueue<double> queue(5);

    queue.enqueue(1.2);
    queue.enqueue(2.1);
    queue.enqueue(9.3);

    queue.output();

    seqQueue<double>queue2(5);
    queue2.enqueue(4.1);
    queue2.enqueue(5.9);
    queue2.enqueue(6.2);

    queue2 = queue;
    queue2.output();

    cout<<"queue:elemCount: "<<queue.elemCount()<<endl;
    cout<<"queue2:elemCount: "<<queue2.elemCount()<<endl;

    cout<<"queue-->front: "<<queue.elemFront()<<endl;
    cout<<"queue-->rear: "<<queue.elemRear()<<endl;

    return 0;
}

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

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

相关文章

Unity进阶--声音管理器学习笔记

文章目录 声音管理器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class AudioManager : MyrSingletonBase<AudioManager> {//环境音private AudioSource enPlayer;//音效private AudioSource sePlayer;//音乐private Audio…

IDEA使用AWS CodeWhisperer

IDEA使用AWS CodeWhisperer 首先在IDEA的插件市场中下载AWS Toolkit&#xff1a; 这里我使用的IDEA是2023.1&#xff0c;就是在ToolWindows里把AWS Toolkit面板调出来&#xff1a; 连接&#xff1a; 打开的网页中粘贴上面提过的代码。进入注册流程。 注册完成后返回IDEA&am…

自动驾驶感知系统-毫米波雷达

毫米波雷达就是电磁波&#xff0c;雷达通过发射无线电信号并接收反射信号来测定车辆与物体间的距离&#xff0c;其频率通常介于10~300GHz之间。与厘米波导引头相比&#xff0c;毫米波导引头体积小&#xff0c;质量轻&#xff0c;空间分辨率高&#xff1b;与红外、激光、电视等光…

Vue--插槽

一、插槽-默认插槽 1.作用 让组件内部的一些 结构 支持 自定义 2.需求 将需要多次显示的对话框,封装成一个组件 3.问题 组件的内容部分&#xff0c;不希望写死&#xff0c;希望能使用的时候自定义。怎么办 4.插槽的基本语法 组件内需要定制的结构部分&#xff0c;改用**…

STM32 HAL库定时器输入捕获+更新中断

STM32 HAL库定时器输入捕获更新中断 &#x1f4cd;相关参考&#xff1a;https://www.cnblogs.com/kevin-nancy/p/12569377.html#4621839&#x1f4cc;相关篇《STM32 HAL库定时器输入捕获SlaveMode脉宽测量》 ✨高级定时器的输入捕获功能在脉宽信号测量方面是非常方便的。尤其时…

代码随想录算法训练营第二十一天 | 读PDF复习环节1

读PDF复习环节1 本博客的内容只是做一个大概的记录&#xff0c;整个PDF看下来&#xff0c;内容上是不如代码随想录网站上的文章全面的&#xff0c;并且PDF中有些地方的描述&#xff0c;是很让我疑惑的&#xff0c;在困扰我很久后&#xff0c;无意间发现&#xff0c;其网站上的讲…

JavaEE——Spring中存取Bean的注解

目录 一、存储Bean对象 1、定义 2、存储方式 &#xff08;1&#xff09;、类注解 【1】、Controller&#xff08;控制器存储&#xff09; 【2】、Service&#xff08;服务存储&#xff09; 【3】、Repository&#xff08;仓库存储&#xff09; 【4】、Component&#xf…

创造型模式-原型模式(场景体验-》方案解决===代码图解)

创造型模式-原型模式 创建重复对象-场景体验解决方案&#xff08;原型模式&#xff09;原型模式定义 创建重复对象-场景体验 今天来一个大客户&#xff0c;他要求帮他下100个订单。每个订单除了用户ID&#xff0c;和用户名不同之外&#xff0c;其他个人信息完全相同。 订单类 …

DASCTF 2023 0X401七月暑期挑战赛RE题解

比赛期间没有什么时间&#xff0c;赛后做的题。 TCP 这题最难&#xff0c;耗时最久&#xff0c;好像做出来的人不多。 程序开始有个初始化随机数的过程&#xff0c;数据写入qword_5060开始的48个字节。 这里是主函数&#xff0c;连接到服务器以后&#xff0c;先接收32个字节…

c函数学习

函数的概念 函数是c语言的功能单位&#xff0c;实现一个功能可以封装一个函数来实现。定义函数的时候一切以功能为目的&#xff0c;根据功能去定义函数的参数和返回值 函数的分类 从定义角度分类&#xff1a;库函数&#xff08;c库实现的&#xff09;&#xff0c;自定义函数&…

springboot集成

maven配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>org.apache.commons</groupId><artifactId>…

小程序中vant-weapp时间选择使用方法

一、选择单个时间点&#xff1a; wxml&#xff1a; <van-celltitle"选择预约时间"value"{{ time }}"bind:click"onDisplay"/><van-calendarshow"{{ show }}"bind:close"onClose"bind:confirm"onConfirm"…

数学建模学习(3):综合评价类问题整体解析及分析步骤

一、评价类算法的简介 对物体进行评价&#xff0c;用具体的分值评价它们的优劣 选这两人其中之一当男朋友&#xff0c;你会选谁&#xff1f; 不同维度的权重会产生不同的结果 所以找到每个维度的权重是最核心的问题 0.25 二、评价前的数据处理 供应商ID 可靠性 指标2 指…

Redis应用(2)——Redis的项目应用(一):验证码 ---> UUID到雪花ID JMeter高并发测试 下载安装使用

目录 引出Redis的项目应用&#xff08;一&#xff09;&#xff1a;验证码1.整体流程2.雪花ID1&#xff09;UUID&#xff08;Universally Unique Identifier&#xff0c;通用唯一识别码&#xff09;2&#xff09;Twitter 的雪花算法&#xff08;SnowFlake&#xff09; 雪花ID优缺…

Jenkins常用管理功能配置 - 插件管理

Jenkins插件介绍 Jenkins是一个流行的开源持续集成/持续交付(CI/CD)工具&#xff0c;它有大量的插件来扩展其功能。这些插件可以用于构建、测试、部署和监控软件项目。下面是一些常用的Jenkins插件及其简单介绍和使用方法&#xff1a; 1. Git插件&#xff1a;允许Jenkins从Gi…

网络概念,《TCP/IP五层网络模型》与《数据的网络传输---“封装”与“分用”过程》

文章目录 概念协议协议分层TCP/IP五层网络模型数据的网络传输---“封装”与“分用”“封装”与“分用” 的过程 接收过程 概念 局域网&#xff1a;把一些设备通过交换机/路由器连接起来。 广域网&#xff1a;把更多的局域网也相互连接称为广域网。 交换机&#xff1a;交换机是…

采用桥接模式使虚拟机\笔记本\linux台式机互通

目录 一、环境&#xff1a;二、连接模式1. 桥接模式2. 主机共享模式3. NAT模式 三、配置1. 笔记本WIFI网络配置2. VM配置3.虚拟机配置3.1. 先看网络信息&#xff0c;确定修改ens333.2. 修改ens333.3. 重启网络 四、测试五、错误解决5.1 现象5.2 解决办法5.3 结果 一、环境&…

Spring中Bean的作用域和Spring生命周期

从前面的文章中我们看出Spring是用来存储和读取Bean的&#xff0c;因此Spring中Bean是最核心的资源&#xff0c;所以我们将对Bean进行深入的理解。 Bean的作用域 现在有一个公共的Bean&#xff0c;提供给了两个用户去使用&#xff0c;但是在使用过程中&#xff0c;用户一修改…

Android Studio 修改AVD模拟器文件默认存储路径

AndroidStudio默认的模拟器文件路径为&#xff1a;C:\Users\用户名\.android\avd路径&#xff0c;通常windows系统上&#xff0c;C盘不是太大&#xff0c;而avd文件却不小&#xff0c;通常几个GB&#xff0c;所以有必要将avd路径换到一个非系统盘。 更换方法如下&#xff1a;H…

LeetCode:6. N 字形变换

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 题解目录 一、&#x1f331;[6. N 字形变换](https://leetcode.cn/problems/zigzag-conv…