C++数据结构类的自实现,封装栈,循环队列

2023-11-17

my_Queue.h

#ifndef MY_QUEUE_H
#define MY_QUEUE_H

class My_Queue
{
private:
    int* m_queue;	//队列空间指针
    int front;		//队头
    int tail;		//队尾
    int m_length;	//队列长度

public:
	//构造函数
    My_Queue(int len);
    //构造拷贝函数
    My_Queue(const My_Queue& obj);
    //队列长度
    int length();
    //出队
    bool pop();
    //入队
    bool push(int value);
    //判空
    bool empty();
    //判满
    bool full();
    //遍历
    bool show();
    //析构函数,释放堆空间
    ~My_Queue();
};

#endif // MY_QUEUE_H

my_Queue.c

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

using namespace std;

My_Queue::My_Queue(int len):m_queue(nullptr),front(0),tail(0),m_length(0)
{
    m_queue = new int[len+1];

    for(int i = 0; i < len+1; i++)
    {
        m_queue[i] = 0;
    }

    m_length = len+1;
}

My_Queue::My_Queue(const My_Queue& obj)
{
    m_length = obj.m_length;

    m_queue = new int[obj.m_length];

    for(int i = 0; i < obj.m_length; i++)
    {
        m_queue[i] = obj.m_queue[i];
    }
}

int My_Queue::length()
{
    return (tail + m_length - front) % m_length;
}

bool My_Queue::pop()
{
    bool ret = true;

    if(empty())
    {
        cout << "队列为空" << endl;
        ret = false;
        return ret;
    }

    front = (front + 1) % m_length;
    cout << "出队成功" << endl;

    return ret;
}

bool My_Queue::push(int value)
{
    bool ret = true;

    if(full())
    {
        cout << "队列已满" << endl;
        ret = false;
        return ret;
    }

    m_queue[tail] = value;

    tail = (tail + 1) % m_length;
    cout << "入队成功" << endl;

    return ret;
}

bool My_Queue::empty()
{
    return front == tail;
}

bool My_Queue::full()
{
    return (tail + 1) % m_length == front;
}

bool My_Queue::show()
{
    bool ret = true;

    if( empty() )
    {
        ret = false;
        cout << "队列为空" << endl;
        return ret;
    }

    for(int i = front; i != tail; i = (i+1)%m_length)
    {
        cout << m_queue[i] << " ";
    }

    cout << endl;

    return ret;
}

My_Queue::~My_Queue()
{
    delete[] m_queue;
}

在这里插入图片描述

my_Stack.h

#ifndef MY_STACK_H
#define MY_STACK_H

class My_Stack
{
private:
    int* m_stack;	//栈空间指针
    int m_length;	//栈长度
    int m_max;		//栈容量

public:
	//构造函数
    My_Stack(int len);
    //构造拷贝函数
    My_Stack(const My_Stack& obj);
    //获取栈长度
    int length();
    //获取栈顶变量
    int gettop();
    //出栈
    bool pop();
    //入栈
    bool push(int value);
    //判空
    bool empty();
    //判满
    bool full();
    //遍历
    bool show();
    //清空栈
    bool clear();
    //析构函数释放堆空间
    ~My_Stack();
};

#endif // MY_STACK_H

my_Stack.c

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

using namespace std;

My_Stack::My_Stack(int len):m_stack(nullptr),m_length(0),m_max(0)
{
    m_stack = new int[len];

    for(int i = 0; i < len; i++)
    {
        m_stack[i] = 0;
    }

    m_max = len;
}

My_Stack::My_Stack(const My_Stack& obj)
{
    m_max = obj.m_max;

    m_stack = new int[obj.m_max];

    for(int i = 0; i < obj.m_max; i++)
    {
        m_stack[i] = obj.m_stack[i];
    }
}

int My_Stack::length()
{
    return m_length;
}

int My_Stack::gettop()
{
    if(empty())
    {
        return -1;
    }

    int &top = m_stack[m_length-1];

    return top;
}

bool My_Stack::pop()
{
    bool ret = true;

    if(empty())
    {
        ret = false;
        cout << "栈为空" << endl;
        return ret;
    }

    m_length--;
    cout << "出栈成功" << endl;

    return ret;
}

bool My_Stack::push(int value)
{
    bool ret = true;

    if(full())
    {
        ret = false;
        cout << "栈已满" << endl;
        return ret;
    }

    m_stack[m_length] = value;
    m_length++;
    cout << "入栈成功" << endl;

    return ret;
}

bool My_Stack::empty()
{
    return m_length == 0;
}

bool My_Stack::full()
{
    return m_length == m_max;
}

bool My_Stack::show()
{
    bool ret = true;
    if(empty())
    {
        ret = false;
        cout << "栈为空" << endl;
        return ret;
    }

    for(int i = 0; i < m_length; i++)
    {
        cout << m_stack[i] << " ";
    }
    cout << endl;

    return ret;
}

bool My_Stack::clear()
{
    bool ret = true;

    if(empty())
    {
        ret = false;
        cout << "栈为空" << endl;
        return ret;
    }
    m_length = 0;

    cout << "栈已清空" << endl;

    return ret;
}

My_Stack::~My_Stack()
{
    delete[] m_stack;
}

在这里插入图片描述

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

C++数据结构类的自实现,封装栈,循环队列 的相关文章

随机推荐

  • vue项目实战(一)

    第一步 找到你想要存放项目的文件夹 输入cmd 就会弹出小黑窗 然后输入vue create 项目名 创建项目 前提安装好node js和搭建 vue 环境 打开终端 创建项目 按上下键进行选择 做一些配置 这次选择自定义 也就是最后一个
  • Java_得到GET和POST请求URL和参数列表

    一 获取URL getRequestURL 二 获取参数列表 1 getQueryString 只适用于GET 比如客户端发送http localhost testServlet a b c d e f 通过request getQuery
  • 计算机基础内容——网络基础

    网络基础 设备是如何上网的 网卡 有线 无线 内置天线 网线接口RJ45 usb转RJ45 交换机 路由器 外置天线 天线棒 光猫 宽带运营商 不同的宽带运营商之间是互通的 路由器发出的wifi信号 2 4GHz wifi 5 0GHz w
  • Qt的Tcp服务器多线程编程-附带代码展示

    Qt的Tcp服务器多线程编程 附带代码展示 该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端 此文章没有实现客户端的多线程编程 创建子线程时需要注意的点 1 子线程与主线程之间交互数据时 应采用信号槽的方式 2 子线程中实例化
  • Java基础:多线程join()方法

    join 让当前线程优先执行 JoinThread java public class JoinThread implements Runnable Override public void run for int i 0 i lt 100
  • iis中使用nginx实现反向代理负载均衡

    user nobody worker processes 1 error log logs error log error log logs error log notice error log logs error log info pi
  • vue+element实现树形上下拖拽,快速提升你的前端技能

    前言 随着前端技术的不断发展 越来越多的网站和应用需要使用树形控件来展示数据 而上下拖拽则是一个非常实用的交互方式 如果你正在寻找一种简单易用的树形控件实现上下拖拽的方法 那么本文将为你提供最佳解决方案 本文将介绍如何使用 vue 基于 e
  • Java中三种进制的数值常量

    package cn nxl2018 class Test 十进制常量赋值 void decimals byte b 10 short s 10 char ch 69 int i 10 long l 10l l L可加可不加 float f
  • 【Java面试】请你简单说一下Mysql的事务隔离级别

    一个工作了6年的粉丝 去阿里面试 在第一面的时候被问到 Mysql的事务隔离级别 他竟然没有回答上来 一直在私信向我诉苦 我说 你只能怪年轻时候的你 那个时候不够努力导致现在的你技术水平不够 好吧 关于这个问题 看看普通人和高手的回答 普通
  • 计算机网络总结 TCP协议 一

    tcp协议是什么 介绍一下 TCP Transmission Control Protocol 传输控制协议 是互联网协议族中的一种基于连接的 可靠的 面向字节流的传输协议 TCP协议提供了全双工通信 数据分段 重传机制 流量控制 拥塞控制
  • java中synchronized关键字

    1 synchronized关键字简介 synchronized是java中的一个关键字 在中文中为同步 也被称之为 同步锁 以此来达到多线程并发访问时候的并发安全问题 可以用来修饰代码块 非静态方法 静态方法等 修饰代码块时 给当前指定的
  • 事务提交后发送MQ消息

    前言 本文主要介绍关于MQ使用过程中 通过场景分析为什么要使用事务控制 以及事务如何实现 场景分析 为什么我们在使用MQ的时候需要考虑结合事务 试想一下 我们平时使用Mq发送消息的通用场景是不是 生产者和MQ集群建立连接 并发送消息 消费者
  • 《算法图解》总结第 6 章:广度优先搜索

    仅用于记录学习 欢迎批评指正 大神勿喷 系列文章目录 算法图解 总结第 1 章 二分查找 大O表示法 算法图解 总结第 2 章 数组和链表 选择排序 算法图解 总结第 3 章 while循环 递归 栈 算法图解 总结第 4 章 分而治之 快
  • 学成在线笔记+踩坑(12)——用户认证

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 牛客面试题 目录 1 需求分析 2 认证模块 连接用户中心数据库 2 1 连接数据
  • Linux Ubuntu Shell命令(软件安装)

    软件安装命令 dpkg工具集 不会下载对应的依赖集 不好用 Ubuntu支持 deb结尾的安装包 Redhat支持 rpm结尾的安装包 命令 1 安装 sudo dpkg i 安装包名 sudo dpkg i vsftpd 3 0 2 1u
  • Flex布局详解

    目录 一 Flex 布局是什么 二 基本概念 三 容器的属性 3 1 flex direction属性 3 2 flex wrap属性 3 3 flex flow 3 4 justify content属性 3 5 align items属
  • 将Hypert-V转化为VM虚拟机

    一 准备工具 V2V Converter P2V Converter Converting VM Formats 二 操作步骤 第一步 选中要转化的镜像 第二步 选择目标的镜像格式 第三步 选择生成目录 完成后点击Finish 第五步 打开
  • 常用的相似度计算方法原理及实现

    在数据分析和数据挖掘以及搜索引擎中 我们经常需要知道个体间差异的大小 进而评价个体的相似性和类别 常见的比如数据分析中比如相关分析 数据挖掘中的分类聚类 K Means等 算法 搜索引擎进行物品推荐时 相似度就是比较两个事物的相似性 一般通
  • SeleniumLibrary4.5.0 关键字详解(四)

    SeleniumLibrary4 5 0 关键字详解 四 库版本 4 5 0 库范围 全局 命名参数 受支持 简介 SeleniumLibrary是Robot Framework的Web测试库 本文档说明了如何使用SeleniumLibra
  • C++数据结构类的自实现,封装栈,循环队列

    my Queue h ifndef MY QUEUE H define MY QUEUE H class My Queue private int m queue 队列空间指针 int front 队头 int tail 队尾 int m