c++实现数据结构栈和队列

news2025/1/11 12:42:02

1、栈

头文件

#ifndef ZHAN_H
#define ZHAN_H

#define MAX 8
#include <iostream>
using namespace std;

class Shu
{
    int datatype;  //入栈的数据
    int *arr;  //栈的数组
    int top;  //记录栈顶元素的下标

public:
    //构造函数
    Shu();


    //析构函数
    ~Shu();


    //判断空
    int stack_empty();

    //判断满
    int stack_full();

    //入栈
    int stack_push(int data);

    //遍历栈
    void stack_show();

    //出栈
    int stack_pop();

    //获取栈顶元素
    int stack_top();

    //求栈的大小
    int stack_size();

    //清空栈
    void stack_free();

};

void xitong();

#endif // ZHAN_H

源文件

#include "zhan.h"

Shu::Shu()
{
    datatype=0;
    arr = new int[MAX];
    top=-1;
}

Shu::~Shu()
{
    delete arr;
    arr=nullptr;
}

//判断空
int Shu::stack_empty()
{
    if(NULL==arr)
    {
        cout<<"判空失败"<<endl;
        return -1;
    }

    return this->top==-1;

}

//判断满
int Shu::stack_full()
{
    if(NULL==arr)
    {
        cout<<"判满失败"<<endl;
        return -1;
    }

    return this->top==MAX-1;
}

//入栈
int Shu::stack_push(int data)
{
    datatype=data;
    if(stack_full())
    {
        cout<<"入栈失败"<<endl;
        return -1;
    }

    //top下标自增
    this->top++;

    //将输入的函数放入数组中
    arr[this->top]=datatype;

    cout<<"入栈成功"<<endl;

    return 0;
}

//遍历栈
void Shu::stack_show()
{
    if(stack_empty())
    {
        cout<<"遍历失败"<<endl;
        return ;
    }

    //遍历
    for(int i=0;i<this->top+1;i++)
    {
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}

//出栈
int Shu::stack_pop()
{
    if(stack_empty())
    {
        cout<<"出栈失败"<<endl;
        return -1;
    }

    //出栈
    cout<<arr[this->top]<<"出栈成功"<<endl;

    //自减
    this->top--;

    return 0;
}

//获取栈顶元素
int Shu::stack_top()
{
    if(stack_empty())
    {
        cout<<"获取栈顶元素失败"<<endl;
        return -1;
    }

    //获取栈顶元素
    cout<<"栈顶元素为:"<<arr[top]<<endl;

    return 0;
}

//求栈的大小
int Shu::stack_size()
{
    if(stack_empty())
    {
        cout<<"求栈大小失败"<<endl;
        return -1;
    }

    //栈的大小
    int size=this->top+1;

    cout<<"栈的大小为:"<<size<<endl;
    return 0;
}

//清空栈
void Shu::stack_free()
{
    this->top=-1;

    cout<<"清空栈成功"<<endl;
}

//系统函数
void xitong()
{
    //定义一个Shu类型的变量名
    Shu zhan;
    while(1)
    {
        END:
        system("CLS");
        cout<<"**********************"<<endl;
        cout<<"********1、入栈********"<<endl;
        cout<<"********2、遍历********"<<endl;
        cout<<"********3、出栈********"<<endl;
        cout<<"********4、栈顶元素*****"<<endl;
        cout<<"********5、栈的大小*****"<<endl;
        cout<<"********0、退出********"<<endl;
        cout<<"**********************"<<endl;

        int num;
        int data;
        cout<<"请输入对应的功能:";
        cin>>num;
        switch(num)
        {
        case 1:
            cout<<"请输入要加入的数:";
            cin>>data;
            zhan.stack_push(data);
            break;
        case 2:
            zhan.stack_show();
            break;
        case 3:
            zhan.stack_pop();
            break;
        case 4:
            zhan.stack_top();
            break;
        case 5:
            zhan.stack_size();
            break;
        case 0:
            goto ENDL;
        }
        int qp;
        cout<<"输入清屏(7):";
        cin>>qp;
        if(qp==7)
        {
            goto END;
        }
    }
    ENDL:

    cout<<"系统退出成功"<<endl;
    zhan.stack_free();

}

主函数

#include <iostream>
#include "zhan.h"

using namespace std;

int main()
{
    xitong();
    return 0;
}

2、循环队列

头文件

#ifndef DUILIE_H
#define DUILIE_H

#define MAX 8
#include <iostream>
using namespace std;

class Shu
{
    int datatype;  //入队的数据
    int *arr;  //循环队列的数组
    int head;  //记录队列头元素的下标
    int tail;  //记录队列尾元素下标

public:
    //构造函数
    Shu();


    //析构函数
    ~Shu();


    //判断空
    int queue_empty();

    //判断满
    int queue_full();

    //入队
    int queue_push(int data);

    //遍历队
    void queue_show();

    //出队
    int queue_pop();

    //求队列的大小
    int queue_size();

    //清空队
    void queue_free();

};

//系统函数
void xitong();

#endif // DUILIE_H

源文件

#include "duilie.h"

Shu::Shu()
{
    datatype=0;
    arr = new int[MAX];
    head=0;
    tail=0;
}

Shu::~Shu()
{
    delete arr;
    arr=nullptr;
}

//判断空
int Shu::queue_empty()
{
    if(NULL==arr)
    {
        cout<<"判空失败"<<endl;
        return -1;
    }

    return this->head==this->tail;

}

//判断满
int Shu::queue_full()
{
    if(NULL==arr)
    {
        cout<<"判满失败"<<endl;
        return -1;
    }

    return (this->tail+1)%MAX==this->head;
}

//入队
int Shu::queue_push(int data)
{
    datatype=data;
    if(queue_full())
    {
        cout<<"入队失败"<<endl;
        return -1;
    }

    //将输入的函数放入数组中
    arr[this->tail]=datatype;

    //尾下标自增
    this->tail=(this->tail+1)%MAX;

    cout<<"入队成功"<<endl;

    return 0;
}

//遍历栈
void Shu::queue_show()
{
    if(queue_empty())
    {
        cout<<"遍历失败"<<endl;
        return ;
    }

    //遍历
    for(int i=this->head;i!=this->tail;i=(i+1)%MAX)
    {
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}

//出队
int Shu::queue_pop()
{
    if(queue_empty())
    {
        cout<<"出队失败"<<endl;
        return -1;
    }

    //出队
    cout<<arr[this->head]<<"出队成功"<<endl;

    //自增
    this->head=(this->tail+1)%MAX;

    return 0;
}

//求队列的大小
int Shu::queue_size()
{
    if(queue_empty())
    {
        cout<<"求队列大小失败"<<endl;
        return -1;
    }

    //栈的大小
    int size=(this->tail+MAX-this->head)%MAX;

    cout<<"队列的大小为:"<<size<<endl;
    return 0;
}

//清空栈
void Shu::queue_free()
{
    this->head=0;
    this->tail=0;

    cout<<"清空队列成功"<<endl;
}

//系统函数
void xitong()
{
    //定义一个Shu类型的变量名
    Shu zhan;
    while(1)
    {
        END:
        system("CLS");
        cout<<"**********************"<<endl;
        cout<<"********1、入队********"<<endl;
        cout<<"********2、遍历********"<<endl;
        cout<<"********3、出队********"<<endl;
        cout<<"********4、队列的大小***"<<endl;
        cout<<"********0、退出********"<<endl;
        cout<<"**********************"<<endl;

        int num;
        int data;
        cout<<"请输入对应的功能:";
        cin>>num;
        switch(num)
        {
        case 1:
            cout<<"请输入要加入的数:";
            cin>>data;
            zhan.queue_push(data);
            break;
        case 2:
            zhan.queue_show();
            break;
        case 3:
            zhan.queue_pop();
            break;
        case 4:
            zhan.queue_size();
            break;
        case 0:
            goto ENDL;
        }
        int qp;
        cout<<"输入清屏(7):";
        cin>>qp;
        if(qp==7)
        {
            goto END;
        }
    }
    ENDL:

    cout<<"系统退出成功"<<endl;
    zhan.queue_free();

}

主函数

#include <iostream>
#include "duilie.h"

using namespace std;

int main()
{
    xitong();
    return 0;
}

3、思维导图

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

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

相关文章

COSCon'23 Call for Speakers

一年一度的开源盛会&#xff0c;COSCon23 第八届中国开源年会&#xff0c;将于10月28~29日&#xff0c;在四川成都市高新区菁蓉汇召开&#xff01; The yearly open source event, COSCon23 8th Annual China Open Source Conference, will be taken place on 28th~29th Octobe…

【编码魔法师系列_构建型1.1】简单工厂模式(Static Factory)

学会设计模式&#xff0c;你就可以像拥有魔法一样&#xff0c;在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们&#xff08;GoF&#xff09;凝聚出来的最佳实践&#xff0c;可以提高代码的可读性、可维护性和可重用性&#xff0c;从而让我们的开发效率更高。通…

让照片动起来的软件,轻松制作照片动效

随着社交媒体的日益普及&#xff0c;我们对于照片的要求也越来越高。普通的照片已经不能满足我们的需求&#xff0c;我们希望照片更加生动有趣。照片动效便应运而生&#xff0c;它可以让照片动起来&#xff0c;吸引更多的注意力&#xff0c;让照片更加生动有趣。 照片动效制作起…

软件验收测试

1. 服务流程 验收测试 2. 服务内容 测试过程中&#xff0c;根据合同要求制定测试方案&#xff0c;验证工程项目是否满足用户需求&#xff0c;软件质量特性是否达到系统的要求。 3. 周期 10-15个工作日 4. 报告用途 可作为进行地方、省级、国家、部委项目的验收&#xff0…

Java-华为真题-预定酒店

需求&#xff1a; 放暑假了&#xff0c;小王决定到某旅游景点游玩&#xff0c;他在网上搜索到了各种价位的酒店&#xff08;长度为n的数组A&#xff09;&#xff0c;他的心理价位是x元&#xff0c;请帮他筛选出k个最接近x元的酒店&#xff08;n>k>0&#xff09;&#xff…

JavaScript中的Generator函数及其使用方式

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Generator函数⭐ 创建Generator函数⭐ 调用Generator函数⭐ Generator函数的应用1. 异步编程2. 生成器&#xff08;Generator&#xff09; ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧…

L1-002 打印沙漏分数 20

L1-002 打印沙漏 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ************ *****所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符…

23年11月PMP考试如何报名?如何备考?(含备考干货)

总分为4个步骤&#xff1a;英文报名--审核【抽中后快递材料审核】--中文报名--在线支付费用 一、PMP英文报名&#xff1a; 英文报名时间无限制&#xff0c;但有一年的有效期&#xff0c;所以大家尽量提前报名 二、审核&#xff1a; PMI网站对你英文报名的材料进行审核&…

Java——》synchronized锁升级

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

Win11共享文件夹怎么设置

当我们在使用Win11的过程中有时会因为一些操作需要共享文件夹&#xff0c;那么Win11系统该如何设置共享文件夹呢&#xff0c;下面小编就给大家详细介绍一下Win11设置共享文件夹的方法&#xff0c;有需要的小伙伴快来和小编一起看看吧。 Win11设置共享文件夹的方法&#xff1a;…

MySQL——无法打开MySQL8.0软件安装包或者安装过程中失败,如何解决?

在运行MySQL8.0软件安装包之前&#xff0c;用户需要确保系统中已经安装了.Net Framework相关软件&#xff0c;如果缺少此软件&#xff0c;将不能正常地安装MySQL8.0软件。 解决方案&#xff1a;到这个地址 https://www.microsoft.com/en-us/download/details.aspx?id42642…

如何查询成绩或工资

为什么每次查询成绩或者工资的时候都觉得麻烦又耗时呢&#xff1f;在过去&#xff0c;我们可能需要去学校或公司的相关部门&#xff0c;填写繁琐的表格&#xff0c;然后等待工作人员进行查询和处理。这不仅浪费了我们宝贵的时间&#xff0c;还可能出现查询结果不准确或者遗漏的…

华为OD机试 - 快速人名查找 - 深度优先搜索dfs(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

天津大数据培训学校 大数据可从事的行业

大数据行业近年来呈现出爆炸式的增长态势&#xff0c;各行各业都越来越依赖数据来指导业务决策和创新发展&#xff0c;因此&#xff0c;大数据专业人才的需求也随之增长。这种行业需求的增长为大数据就业提供了良好的机会&#xff0c;尤其是对于具备相关技能和知识的人来说。 …

KT142C-sop16语音芯片9600串口uart命令如何测试_详细说明

KT142C是一个提供串口的SOP16语音芯片&#xff0c;完美的集成了MP3的硬解码。内置330KByte的空间&#xff0c;最大支持330秒的语音长度&#xff0c;支持多段语音&#xff0c;支持直驱0.5W的扬声器无需外置功放 串口测试的软件截图如下&#xff1a; 7E 3F 00 02 00 04 EF--- 代…

第五章 Linux常用应用软件

第五章 Linux常用应用软件 ​ Ubuntu包含了日常所需的常用程序&#xff0c;集成了跨平台的办公套件LibreOffice和Mozila Firefox浏览器等。还提供了文本处理工具、图片处理工具等。 1.LibreOffice ​ LibreOffice免费开源&#xff0c;遵照GPL分发源代码&#xff0c;与OpenOf…

oauth2 授权模式 - 第三方登录

Oauth2 OAuth 2.0 是目前最流行的授权机制&#xff0c;用来授权第三方应用&#xff0c;获取用户数据。 OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的规范标准。与以往的授权方式不同之处是 OAuth 的授权不会使第三方触及到用户的帐号信息&#xff08;如用户…

3D WEB轻量化引擎HOOPS Commuicator技术概览(一):数据导入与加载

HOOPS Communicator是一款功能强大的SDK&#xff0c;适用于基于Web的高级工程应用程序&#xff0c;代表HOOPS Web平台的Web开发组件。使用HOOPS Communicator&#xff0c;您可以构建一个在 Web浏览器中提供3D模型的Web应用程序。 HOOPS Communicator可以本地加载多种模型格式。…

GO语言篇之CGO

GO语言篇之CGO 文章目录 GO语言篇之CGO前言C代码嵌入GO代码C文件嵌入GO代码缺点 前言 Go语言可以通过内置的CGO调用C语言接口&#xff0c;从而实现C语言代码的交互&#xff0c;CGO提供了一种将Go代码嵌入到C代码中&#xff0c;或者从Go代码中调用C函数的方法 C代码嵌入GO代码…

ThreadPoolExecutor

官方API解释线程池的好处&#xff1a; &#xff08;1&#xff09;通过重用线程池中的线程&#xff0c;来减少每个线程创建和销毁的性能开销。 &#xff08;2&#xff09;对线程进行一些维护和管理&#xff0c;比如定时开始&#xff0c;周期执行&#xff0c;并发数控制等等。 …