// 设计一个 Stack 的类，实现栈的基本操作，包括入栈、出栈和判断栈是否为空等。主要用于存放int数值或string字符串，并对其操作。
// 【提示】
// 1\)  使用数组实现，每一次重分数组空间的大小是原大小的2倍；

// 2\)  Stack是栈的结构（FILO先进后出的）
#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

class Stack
{
private:
    int capacity; // 栈容量
    int size;     // 当前栈中元素个数
    int *data;    // 存放栈的数组
public:
    Stack()
    {
        this->capacity = 10; // 初始容量
        this->size = 0;
        this->data = new int[this->capacity]; // 初始化栈数据数组
    }
    ~Stack()
    {
        delete[] data; // 删除栈数据数组
    }

public:
    void push(int value); // 入栈
    int pop();            // 出栈
    int isEmpty();        // 判断栈空否
};

void Stack::push(int value)
{
    if (size == capacity)
    {
        cout << "栈满，重新分配空间中" << endl;
        int newCapacity = capacity * 2;
        int *newData = new int[newCapacity];
        for (int i = 0; i < size; i++)
        {
            newData[i] = data[i];
        }
        delete[] data;
        data = newData;
        capacity = newCapacity;
        cout << "空间分配完成，数据转存完毕" << endl;
    }
    data[size] = value;
    cout << value << " 入栈成功" << endl;
    size++;
}

int Stack::pop()
{
    if (size == 0)
    {
        cout << "栈空" << endl;
    }
    else
    {
        int popValue = data[size - 1];
        size--;
        cout << "出栈成功" << endl;
        return popValue;
    }
}

int Stack::isEmpty()
{
    if (size == 0)
    {
        cout << "栈空" << endl;
        return 1; // 非 0 为栈空
    }
    else
    {
        return 0;
        cout << "栈不空" << endl;
    }
}

int main()
{
    Stack stk;

    stk.push(10);
    stk.push(12);
    stk.push(16);
    stk.push(5);

    while (!stk.isEmpty())
    {
        cout << stk.pop() << " ";
    }
    cout << endl;

    // stk.push(7);

    stk.isEmpty();

    return 0;
}
