28.C++ 整型栈

#include<iostream>
#include<cstdlib>    // #include<stdlib.h>
using namespace std;

class MyStack
{
private:
    enum { STACK_INIT_SIZE = 10, STACK_INC_SIEZ = 2 };
    int* _data;
    int _size;    //容量
    int _top;     // 栈顶指针 
    void Expand()//增容函数
    {
        int new_size = _size * STACK_INC_SIEZ; // 计算新的容量
        int* new_data = new(nothrow) int[new_size]; // 分配新的内存空间
        if (nullptr == new_data)
        {
            exit(EXIT_FAILURE);
        }
        // 将原栈中的元素复制到新的内存空间中
        for (int i = 0; i <= _top; ++i)
        {
            new_data[i] = _data[i];
        }
        // 释放原栈中的内存空间
        delete[]_data;
        // 更新成员变量
        _data = new_data;
        _size = new_size;
    }

public:
    MyStack() :_data(nullptr), _size(STACK_INIT_SIZE), _top(-1) // 
    {
        _data = new(nothrow) int[_size]; //C++   throw std::bad_alloc
        if (nullptr == _data)
        {
            exit(EXIT_FAILURE);
        }
    }
    MyStack(int sz)
        :_data(nullptr),
        _size(sz > STACK_INIT_SIZE ? sz : STACK_INIT_SIZE),
        _top(-1) // 
    {
        _data = new(nothrow) int[_size]; //C++   throw std::bad_alloc
        if (nullptr == _data)
        {
            exit(EXIT_FAILURE);
        }
    }
    ~MyStack()
    {
        if (nullptr != _data)
        {
            delete[]_data;
        }
        _data = nullptr;
        _size = 0;
        _top = -1;
    }
    //int Size(const MyStack * const this)
    int Size() const { return _top + 1; }
    bool Empty() const { return Size() == 0; }
    int Capt() const { return _size; }
    bool Full() const { return Capt() == Size(); }
    bool Push(int val)//入栈
    {
        if (Full())
        {
            Expand();
        }
        _data[++_top] = val;
        return true;
    }
    bool Top(int& val) const  // 取栈顶元素,元素不出栈
    {
        if (Empty()) return false;
        val = _data[_top];
        return true;
    }
    bool Pop()   // 只是出栈
    {
        if (Empty()) return false;
        _top -= 1;
        return true;
    }
    bool GetPop(int &val) // 取栈顶元素和出栈
    {
        if (Empty()) return false;
        val = _data[_top];
        _top = _top - 1;
        return true;
    }
};

int main() {
    MyStack s;
    for (int i = 0; i < 17; i++) {
        s.Push(i);
    }
    int val = 0;
    while (s.GetPop(val)) {
        cout <<val<< endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清酒。233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值