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

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

// 使用MySstack实现栈

#include 
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 
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; // 最后队列为空
    }
}

你可能感兴趣的:(c++,算法,开发语言,c语言,笔记)