C++手动实现栈、和队列

news2024/9/29 13:25:02

栈的实现

头文件
#ifndef MY_STACK_H
#define MY_STACK_H
#include <iostream>

using namespace std;


class my_stack
{
private:
    int *base;//动态栈指针
    int top;//栈顶元素
    int size;//栈大小
public:
    my_stack();//无参构造
    my_stack(int size):top(-1),size(size)
    {
        base = new int[this->size];
        cout<<"有参构造"<<endl;
    }
    ~my_stack()
    {
        delete []base;
        cout<<"析构函数"<<endl;
    }

    //赋值
    my_stack & operator=(const my_stack &str);

    //访问栈顶元素
    int my_top();

    //检查容器是否为空
    bool my_empty();

    //返回容纳元素数
    int my_size();
    //插入栈顶
    void my_push(int value);
    //删除栈顶
    void my_pop();
};

#endif // MY_STACK_H
源文件
#include "my_stack.h"

//赋值
my_stack & my_stack::operator=(const my_stack &str)
{
    if(this != &str)
    {
        delete []base;
        this->size = str.size;
        this->top = str.top;
        base = new int[size];
        for(int i = 0;i<size;i++)
        {
            base[i] = str.base[i];
        }
    }
    return *this;
}

//访问栈顶元素
int my_stack::my_top()
{
    if(my_empty())
    {
        cout<<"栈为空"<<endl;
        return -1;
    }
    return base[top];
}

//检查容器是否为空
bool my_stack::my_empty()
{
    return top == -1;
}

//返回容纳元素数
int my_stack::my_size()
{
    return top+1;
}
//插入栈顶
void my_stack::my_push(int value)
{
    if(top >= size)
    {
        cout<<"栈满"<<endl;
        return;
    }
    base[++top] = value;
    cout<<value<<"插入成功"<<endl;
}
//删除栈顶
void my_stack::my_pop()
{
    if(my_empty())
    {
        cout<<"栈为空"<<endl;
        return;
    }
    top--;
    cout<<"删除栈顶成功"<<endl;
}
主程序
#include "my_stack.h"
int main()
{
    my_stack s(10);
    s.my_push(23);
    s.my_push(45);
    s.my_push(74);

    cout<<"栈顶 = "<<s.my_top()<<endl;
    cout<<"栈元素个数="<<s.my_size()<<endl;
    s.my_pop();
    cout<<"删除栈顶后栈元素个数="<<s.my_size()<<endl;
    return 0;
}

队列的实现

头文件
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>

using namespace std;


class queue
{
private:
    int *base;//队列动态数组
    int front;//头部
    int rear;//尾部
    int size;//容器大小
public:
    queue();//无参构造
    queue(int size):front(0),rear(0),size(size)//有参构造
    {
        base = new int[size];
        cout<<"有参构造"<<endl;
    }
    //析构函数
    ~queue()
    {
        delete [] base;
        cout<<"析构函数"<<endl;
    }

    //赋值
    queue &operator=(const queue &str);
    //访问第一个元素
    int my_front();
    //访问最后一个元素
    int my_back();
    //检查容器是否为空
    bool my_empty();
    //返回容器的元素数
    int my_size();
    //向队尾插入元素
    void my_push(int value);
    //删除首个插入元素
    void my_pop();
};

#endif // QUEUE_H
源文件
#include "queue.h"

//赋值
queue &queue::operator=(const queue &str)
{
    if(this != &str)
    {
        delete []base;
        front = str.front;
        rear = str.rear;
        size = str.size;
        base = new int[size];
        for(int i = front;i<rear;i++)
        {
            base[i] = str.base[i];
        }
    }
    return *this;
}
//访问第一个元素
int queue::my_front()
{
    if(my_empty())
    {
        cout<<"队列为空"<<endl;
        return -1;
    }
    return base[front];
}
//访问最后一个元素
int queue::my_back()
{
    if(my_empty())
    {
        cout<<"队列为空"<<endl;
        return -1;
    }
    return base[rear-1];
}
//检查容器是否为空
bool queue::my_empty()
{
    return rear == front;
}
//返回容器的元素数
int queue::my_size()
{
    return rear-front;
}
//向队尾插入元素
void queue::my_push(int value)
{
    base[rear++] = value;
    cout<<"插入成功"<<endl;
}
//删除首个插入元素
void queue::my_pop()
{
    if(my_empty())
    {
        cout<<"队列为空"<<endl;
        return;
    }
    cout<<"首元素"<<base[front++]<<"删除成功"<<endl;
}
主程序
#include "queue.h"

int main()
{
    queue s(10);
    s.my_push(14);
    s.my_push(24);
    s.my_push(41);
    s.my_push(4);
    cout<<"最后一个元素是"<<s.my_back()<<endl;
    s.my_pop();
    cout<<"第一个元素"<<s.my_front()<<endl;
    return 0;
}

思维导图

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

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

相关文章

机器学习——Bagging

Bagging&#xff1a; 方法&#xff1a;集成n个base learner模型&#xff0c;每个模型都对原始数据集进行有放回的随机采样获得随机数据集&#xff0c;然后并行训练。 回归问题&#xff1a;n个base模型进行预测&#xff0c;将得到的预测值取平均得到最终结果。 分类问题&#xf…

每日 GitHub 探索|构建强大 LLM 管道和优化 AI 聊天框架

探索 DSPy&#xff0c;一款用于优化 LLM 提示和权重的框架。了解 Anthropic Cookbook&#xff0c;该代码库提供使用 Anthropic 强大 AI 模型的可复制代码片段。此外&#xff0c;还有 LobeChat&#xff0c;一个开源、现代设计的 AI 聊天框架&#xff0c;支持多种 AI 供应商和功能…

AI大模型全套学习资料

前言 如果您也对AI大模型感兴趣想学习却苦于没有方向&#x1f440; 小编给自己收藏整理好的学习资料分享出来给大家&#x1f496; &#x1f449;获取方式&#xff1a; &#x1f61d;有需要的小伙伴&#xff0c;可以保存图片到wx扫描二v码关注免费领取【保证100%免费】&#x1…

C盘太满了 用这五个步骤彻底的清理C盘垃圾 真干净!

C盘太满了 用这五个步骤彻底的清理C盘垃圾 真干净&#xff01;C盘忽然满了&#xff0c;这个问题长期困扰着大家&#xff0c;因为太多的人不知道怎么去清理C盘了&#xff0c;毕竟C盘的结构确实是太复杂了&#xff0c;也不是一般人能够充分了解的&#xff0c;所以就间接的导致了大…

代码随想录算法训练营第55天 | 寻找存在的路径

寻找存在的路径 题目描述 给定一个包含 n 个节点的无向图中&#xff0c;节点编号从 1 到 n &#xff08;含 1 和 n &#xff09;。 你的任务是判断是否有一条从节点 source 出发到节点 destination 的路径存在。 输入描述 第一行包含两个正整数 N 和 M&#xff0c;N 代表节点…

openpnp - 为了防止物料操作混乱,做一张物料分布位置图清晰一些

文章目录 openpnp - 为了防止物料操作混乱&#xff0c;做一张物料分布位置图清晰一些概述笔记做子装配图做总装配图备注END openpnp - 为了防止物料操作混乱&#xff0c;做一张物料分布位置图清晰一些 概述 看网上资料&#xff0c;当openpnp贴片机上料后&#xff0c;为了防止…

海山数据库(He3DB)+AI(四):一种基于迁移学习的启发式数据库旋钮调优方法

文章目录 0 前言1 OpAdviser1.1 主要工作1.2 总体流程 2 确定搜索空间2.1 相似任务识别2.2 有效区域提取2.3 多数加权投票 3确定优化器3.1 元特征提取3.2 离线数据生成3.3 Meta-Ranker构建 4 参考文献 0 前言 在海山数据库(He3DB)AI&#xff08;三&#xff09;中&#xff0c;介…

华润置地基于Apache SeaTunnel构建统一数据集成框架

作者&#xff1a;田力、陈允德 编辑整理&#xff1a;曾辉 引言 随着数字化转型的深入&#xff0c;企业对数据集成与处理的需求不断提升&#xff0c;如何高效、灵活地处理多系统、多数据源的同步&#xff0c;成为企业数据系统建设中的关键挑战。 在这篇文章中&#xff0c;来自…

display:flex;和margin的妙用

想要实现这样的效果&#xff1a; 第一个想法就是使用display:flex;justify-content: space-between; 所以想要得到效果&#xff0c;一般来说还需要在盒子外面再套一层盒子才行&#xff0c;但是也可以使用margin来实现。 <!DOCTYPE html> <html lang"en"&g…

makefile和CMakeLists/C++包管理器

make 大家可能会很奇怪&#xff0c;都什么年代了&#xff0c;还学makefile&#xff0c;cmake都有些过时了&#xff0c;为什么还要再学这个呢&#xff1f; 我是这么看待这个问题的&#xff0c;cmake跨平台性还是很有有优势的&#xff0c;有着多年积累的底蕴&#xff0c;借助大模…

c++反汇编逆向还原——do while循环(笔记)

c反汇编逆向还原代码do while循环的实现 涉及到的汇编指令mov、lea、cmp、jle、push 一、汇编 汇编代码 涉及到的指令 mov &#xff1a;将源操作数复制到目的操作数 lea &#xff1a;与mov类似 mov a&#xff0c;b 表示将b赋值给a 若是 mov a&#xff0c;[b] 这是将b的…

OpenAI首席技术官Mira Murati宣布她将离开公司

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

解决VsCode不显示环境名称

在VSCODE终端中激活运行的conda环境&#xff0c;但是只显示PS&#xff0c;并不显示环境名称 PS D:\Code\Pro\003_pro> 解决方法&#xff1a;以管理员权限打开PowerShell 方式1&#xff1a;在Cortana搜索栏中打开带管理员权限的PowerShell 在Windows 10的任务栏搜索框输入p…

Ansible-template模块动态生成特定文件

文章目录 一、Jinja2介绍什么是主要特性安装基本用法进阶特性总结 Jinja2与Ansible关系1. 模板引擎2. Ansible 的依赖3. 变量和模板4. 动态生成配置5. 社区和生态系统总结 二、Ansible如何使用Jinja2使用template模块Jinja2文件中使用判断和循环Jinja2文件中使用判断语法 Jinja…

一文读懂Service以及实践攻略

一文读懂Service以及实践攻略 目录 1 一文读懂 Kubernetes Service 以及实践攻略 1.1 1. 什么是 Service&#xff1f; 1.1.1 为什么需要 Service&#xff1f; 1.2 2. Service 的工作原理 1.2.1 核心概念1.2.2 流量转发过程 1.3 3. Service 的几种类型及应用场景 2 实践&#…

基于SpringBoot校园失物招领系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 本课题的作用、意义&#xff0c;在国内外的研究现状和发展趋势&#xff0c;尚待研究的问题 作用&#xff1a;本课题的目的是使失物招领信息管理清晰化&#xff0c;透明化&#xff0c;便于操作&#xff0c;易于管理。通过功能模…

【JavaSE】-- 类和对象(2)

文章目录 6. 封装6.1 封装的概念6.2 访问限定符6.3 封装拓展之包6.3.1 包的概念6.3.2 导入包中的类6.3.3 自定义包 7. static成员7.1 再谈学生类7.2 static修饰成员变量7.3 static修饰成员方法7.4 static成员变量初始化 8. 代码块8.1 代码块概念以及分类8.2 普通代码块8.3 构造…

神经网络(四):UNet图像分割网络

文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 一、简介 UNet网络是一种用于图像分割的卷积神经网络&#xff0c;其特点是采用了U型网络结构&#xff0c;因此称为UNet。该网络具有编码器和解码器结构&#xff0c;两种结构的功能如下&#…

程序执行过程中,报错debug errror damage :after normal block at

1.现象描述 Visual C 6.0运行一段程序&#xff0c;报错&#xff1a;debug errror damage :after normal block at&#xff08;堆损坏了&#xff09;。网上查了一下&#xff0c;说是内存访问越界。Debug模式下&#xff0c;点击忽略还能继续执行。 下面&#xff0c;我将通过断…

门牌风水大揭秘:如何通过八卦福·门牌提升居住运势

在现代家居风水理念中&#xff0c;门牌不仅是房屋的标识&#xff0c;更是影响居住运势的重要因素。八卦福门牌由于其独特的设计与深厚的文化内涵&#xff0c;已成为风水爱好者的新宠。通过合理运用八卦福门牌&#xff0c;我们可以有效提升家中的气场&#xff0c;增强运势。本文…