当前位置: 首页 > article >正文

C++使用MyStack和MyQueue封装栈和队列

封装栈的构造,复制,判空判满,入栈出栈等函数

// 使用MySstack实现栈

#include <iostream>
using namespace std;

class MyStack
{
private:
    int Top;  // 栈顶位置
    int Size; // 栈大小
    int *Arr; // 数组指针

public:
    MyStack() { cout << "默认构造" << endl; }
    MyStack(int size) : Size(size), Top(-1)
    {
        Arr = new int[size];
        cout << "参数构造" << endl;
    }
    ~MyStack() { cout << "析构" << endl; }
    // 深拷贝赋值运算符重载
    MyStack &operator=(const MyStack &src)
    {
        delete[] Arr; // 删除原数组
        Top = src.Top;
        Size = src.Size;
        Arr = new int[Size];
        // 复制数组
        for (int i = 0; i <= Top; i++)
        {
            Arr[i] = src.Arr[i];
        }
        return *this;
    }
    // 获取栈顶元素
    int top()
    {
        return Arr[Top];
    }
    // 判断是否为空
    bool empty()
    {
        return Top == -1;
    }
    // 获取栈大小
    int size()
    {
        return Top + 1;
    }
    // 入栈
    int push(int val)
    {
        if (Top == Size - 1)
        {
            cout << "栈满" << endl;
            return -1;
        }
        Arr[++Top] = val;
        return 0;
    }
    // 出栈
    int pop()
    {
        if (empty())
        {
            cout << "栈空" << endl;
            return (-1);
        }
        return Arr[Top--];
    }
};
int main()
{
    MyStack s1(10);
    if (s1.empty())
        cout << "栈空" << endl;
    s1.push(1);
    s1.push(2);
    s1.push(3);
    MyStack s2 = s1;
    cout << s2.pop() << endl;
    cout << s2.pop() << endl;
    cout << s2.pop() << endl;
    cout << s2.pop() << endl; // 栈空

    return 0;
}

封装队列的构造,赋值,判空判满,入队出队函数

#include <iostream>
using namespace std;

class Queue
{
private:
    int Front; // 队头的位置
    int Rear;  // 队尾的位置
    int Size;  // 队列的大小
    int *Que;  // 队列本体 

public:
    // 构造函数
    Queue(int size)
    {
        Size = size;
        Front = Rear = 0;
        Que = new int[Size];
        cout << "有参构造" << endl;
    }

    // 析构函数
    ~Queue()
    {
        delete[] Que;
    }
    // empty 判断队列是否为空
    bool empty()
    {
        return Front == Rear;
    }
    // full 判断队列是否已满
    bool full()
    {
        return (Rear + 1) % Size == Front;
    }
    // front 访问第一个元素
    int front()
    {
        if (empty())
        {
            cout << "队列为空" << endl;
            return -1;
        }
        return Que[Front];
    }
    //= 重载赋值函数
    Queue &operator=(const Queue &src)
    {
        if (this != &src)
        {
            delete[] Que; // 释放原有内存
            Size = src.Size;
            Front = src.Front;
            Rear = src.Rear;
            Que = new int[src.Size]; // 分配新的内存
            for (int i = src.Front; i != src.Rear; i = (i + 1) % Size)
            {
                Que[i] = src.Que[i];
            }
        }
        return *this;
    }
    // back 访问最后一个元素
    int back()
    {
        if (empty())
        {
            cout << "队列为空" << endl;
            return -1;
        }
        return Que[Rear];
    }

    // size 返回容纳元素数
    int size()
    {
        return (Rear - Front + Size) % Size;
    }
    // push 入队
    int push(int x)
    {
        if (full())
        {
            cout << "队列已满" << endl;
            return -1;
        }
        Que[Rear] = x;
        Rear = (Rear + 1) % Size;
        return x;
    }
    // pop 出队
    int pop()
    {
        if (empty())
        {
            cout << "队列为空" << endl;
            return -1;
        }
        int result = Que[Front];
        Front = (Front + 1) % Size;
        return result;
    }
};

int main()
{
    Queue q1(5);
    q1.push(1);
    q1.push(2);
    q1.push(3);
    q1.push(4);
    Queue q2 = q1;
    cout << q2.pop() << endl;
    q2.push(5);
    for (int i = 0; i < 5; i++)
    {
        cout << q2.pop() << endl; // 最后队列为空
    }
}


http://www.kler.cn/a/289953.html

相关文章:

  • Spring高手之路26——全方位掌握事务监听器
  • 【HarmonyOS NEXT】一次开发多端部署(以轮播图、Tab栏、列表为例,配合栅格布局与媒体查询,进行 UI 的一多开发)
  • 限流算法(令牌通漏桶计数器)
  • nginx配置负载均衡详解
  • Blender进阶:图像纹理节点和映射节点
  • python装饰器的使用以及私有化
  • Chrome 浏览器插件获取网页 window 对象(方案一)
  • pip切换清华源
  • 数据结构二叉树——堆
  • Scott Brinker:Martech中的AI会让买家体验更好还是更糟?这取决于…….
  • Unity版本升级2022 Gradle 升级7.x版本调整
  • 代码随想录 刷题记录-27 图论 (4)拓扑排序
  • Rides实现分布式锁,保障数据一致性,Redisson分布式事务处理
  • python学习之路 - PySpark快速入门
  • docker实战基础三(Docker基础命令)
  • lvgl 自定义组件介绍二
  • yolo训练策略--使用 Python 和 OpenCV 进行图像亮度增强与批量文件复制之(图像增强是按梯度变化优化)
  • 光盘安全隔离与信息单向导入系统-信刻
  • 以人口金字塔图为例,在线绘制左右双侧堆叠条形图
  • 如何设计店铺租赁租凭平台?Java SpringBoot实现全攻略
  • 后端是否开启异步执行,看打印日志的线程信息
  • 多线程篇(可见性 原子性 有序性(原子性))(持续更新迭代)
  • 09J621-2《电动采光排烟天窗》技术详解
  • openharmony历程一:安装ubuntu20.04
  • Vue基础语法
  • ai聊天软件哪个好用?分享5款实用的智能聊天软件