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

2023-11-11

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、思维导图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++实现数据结构栈和队列 的相关文章

  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • 使用gSOAP与WebService - 第二部分 开发第一个WebService客户端(C++)

    CurrencyConvertor How use gSOAP and WebServices Part 2 Doing the first WS client Download Demo Project 42 1 KB Download
  • JSON空格转义(php、javascript)

    用input控件 存储json数据时 字符串有空格时报错 解决方法 进行空格转义 js文件 javascript var jsonData JSON stringify data replace s g nbsp var rowData
  • python读取图像并相加_python给图像加上mask,并提取mask区域实例

    python对图像提取mask部分 代码 coding utf 8 import os import cv2 import numpy as np def add mask2image binary images path masks pa
  • android nfc中Ndef格式的读写

    原文地址 检测到标签后在Activity中的处理流程 1 在onCreate 中获取NfcAdapter对象 NfcAdapter nfcAdapter NfcAdapter getDefaultAdapter this 2 在onNewI
  • 微信小程序 实现天气类功能

    参考链接 1 全国城市天气预报 城市天气预报查询 国内天气预报查询 天气网 https www tianqi com chinacity html 2 获取实时天气数据 获取数据 开发指南 微信小程序SDK 高德地图API https lb
  • apache字体文件跨域_css引用跨域字体文件woff,eot,ttf问题

    今天把站点的字体的静态文件woff eot ttf放到cdn去速度快一些 改成了外链地址 居然不加载报错 用下面的公用地址可以正常使用 https cdn bootcss com font awesome 4 7 0 fonts 搜索下 是
  • H5 页面采坑记录

    1 页面布局时 上下滑动页面时通常会把一些盒子放在 section section 标签中 但是在一些机型如iphonex测试中 上下滑动页面会出现都抖动的情况 不知道什么原因 解决方案就是 不使用 section 标签 直接在大盒子中写滚
  • 多线程之常用线程安全类型分析

    写在前面 本文一起看下在日常工作中我们经常用到的线程安全的数据类型 以及一些经验总结 1 常用线程安全数据类型 1 1 jdk集合数据类型 jdk的集合数据类型分为两类 一种是线性数据结构 另外一种是字典结构 分别看下 1 1 1 线性数据
  • 通过PyInstaller打包报“文件遇到错误”

    前言 不知道大家在作为python程序后 是不是都通过PyInstaller打包给用户使用呢 但是通过PyInstaller打包会出现一点小小的问题 本文章就来教你如何去解决这些问题 让打包后显示出控制台窗口 在打包的时候 不用加上 w让窗
  • 解码(二):音视频解码上下文创建配置和打开avcodec_open2打开演示

    如下代码 视频解码器打开 找到视频解码器 AVCodec vcodec avcodec find decoder ic gt streams videoStream gt codecpar gt codec id if vcodec cou
  • 远期与期货

    概述 期货合约与远期合约都是规定在将来的某一时间购买或者出售某项资产 这一点与期权类似 关键不同之处在于 期权持有者不会被强制购买或者出售资产 当无利可图时 可以选择放弃交易 但是 期货或者远期合约由必须履行事先约定的合约义务 远期 仅仅是
  • Java Lombok 报错(IllegalAccessError: class lombok.javac.apt.LombokProcessor)解决方法

    本文主要介绍Java 中 使用Lombok报错 java java lang IllegalAccessError class lombok javac apt LombokProcessor的解决方法及示例代码 原文地址 Java Lom
  • Java Swing 如何让界面更加美观

    文章目录 一 设置窗体的背景图 二 设置Button组件 三 设置字体大小和颜色 四 设置组件的背景色 五 综合测试案例 一 设置窗体的背景图 利用JLable类的构造方法或方法加载图片 ImageIcon image new ImageI
  • 设计一个雇员Employee类

    题目内容 设计一个雇员Employee类 具体要求如下 1 设计雇员Employee类 记录雇员的情况 包括姓名 年薪 受雇时间 String name double salary MyDate start 2 定义MyDate类作为日期
  • 装系统时提示 无法在驱动器0分区上安装windows

    先看提示 先看提示 先看提示 1 在重装系统时遇到一个问题 无法在驱动器0分区上安装windows 2 解决方法 1 在当前安装界面按住Shift F10调出命令提示符窗口 2 输入diskpart 按回车执行 3 进入DISKPART命令
  • 负数为什么要用补码来表示?

    上篇文章讲了 负数在计算机中是怎么存储的 看完之后 应该对原码 反码 补码有了基本的了解了 今天 我们深入探讨一下 为什么计算机中要用补码来表示负数 首先 我们应该清楚 原码是方便给人看的 看到一个数的原码 我们就能根据符号位和后边的二进制
  • [144]如何用VBS编写一个简单的恶搞脚本

    windows系统的电脑 首先右击桌面 选择新建 文本文档 在桌面上新建一个文本文档 随后打开计算机或者是我的电脑 点击其中的组织 xp系统多为工具 选择下面的文件夹和搜索选项 在弹出的窗口中点击查看 向下滚到 找到隐藏已知文件类型的扩展名
  • Android(Kotlin)获取应用全局上下文 ApplicationContext

    需求 Android Kotlin 获取应用全局上下文 ApplicationContext 有些场景下需要使用的 Context 是和页面无关的 仅和应用进程相关 比如 读写文件或访问数据库 这些场景下 我们希望可以在项目内任意位置 直接
  • Allegro PCB的布局

    1 手工导入元器件 place manually进入放置设置页面 在需要放置的元器件前面打勾 可以依次放置元器件 2 快速放置元器件 place Quickplace 使用快速放置功能需要先画好板宽outline才可以 3 设置room区域
  • c++实现数据结构栈和队列

    1 栈 头文件 ifndef ZHAN H define ZHAN H define MAX 8 include