栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++实现整型栈(附部分解析和源码)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++实现整型栈(附部分解析和源码)

定义一个My_Stack类,类中的属性有_data(用来存放栈内元素),_size(栈的大小),_top(栈顶),定义栈的初始大小为10,增量为2

类中属性:

    int _size;
    int *_data;
    int _top;

写出构造函数:

   My_Stack(const int sz = STACK_INIT_SIZE)
        : _size(sz),_data(new int[_size]), _top(-1){}

或

    My_Stack(const int sz = STACK_INIT_SIZE)
        : _size(sz),_data(nullptr), _top(-1)
    {
        _data = new int[_size];
    }

或

    My_Stack(const int sz = STACK_INIT_SIZE)
        : _size(sz),_data(nullptr), _top(-1)
    {
        _data = (int*)malloc(sizeof(int) * _size);
        if (nullptr == _data)
        {
            exit(1);
        }
    }

(注意:成员初始化的顺序是按照类型中设计的顺序进行的,和初始化列表顺序无关)

当构建一个对象st时,系统空间分配如图:

析构函数(释放资源):

   ~My_Stack()
    {
        free(_data);//如果用new申请的空间,释放时使用delete [ ]_data;
        _data = nullptr;//释放后将指针置为空,否则指针失效

        _size = 0;
        _top = -1;
    }

入栈过程:

入栈时首先要判断栈是否满了,当元素个数等于容量时,栈满,扩容。出栈时判断栈是否为空,出栈_top--。

入栈:

 bool push(const int val)
    {
        if (full())
        {
            return false;
        }
        _top += 1;
        _data[_top] = val;
        return true;
    }

出栈:

    void pop()
    {
        if (empty())
        {
            cout << "stack empty" << endl;
        }
        _top -= 1;
    }

全部代码如下:

#include
#include
#include
#include
#include

using namespace std;
enum { STACK_INIT_SIZE = 10, STACK_ISC_SIZE = 2 };

class My_Stack
{
private:
    int _size;
    int* _data;
    int _top;
public:
    //构造函数
    My_Stack(const int sz = STACK_INIT_SIZE)
        : _size(sz),_data(nullptr), _top(-1)
    {
        _data = (int*)malloc(sizeof(int) * _size);
        if (nullptr == _data)
        {
            exit(1);
        }
    }

    //析构函数
    ~My_Stack() 
    {
        free(_data);
        _data = nullptr;
        _size = 0;
        _top = -1;
    }
    //判断是否为空
    bool empty()const
    {
        return size() == 0;
    }
    //判断是否为满
    bool full() const
    {
        return size() == capc();
    }
    bool resize(size_t newsz)
    {
        if (newsz <= capc())
        {
            return true;
        }
        int* newdata = (int*)realloc(_data, sizeof(int) * newsz);
        if (nullptr == newdata)return false;
        _data = newdata;
        _size = newsz;
        return true;
    }
    //获取栈中元素个数
    int size()const
    {
        return _top + 1;
    }
    //得到栈的容量大小
    int capc()const
    {
        return _size;
    }
    //入栈
    bool push(const int val)
    {
        if (full()&&resize(capc()*STACK_ISC_SIZE))
        {
            return false;
        }
        _top += 1;
        _data[_top] = val;
        return true;
    }
    //出栈
    void pop()
    {
        if (empty())
        {
            cout << "stack empty" << endl;
        }
        _top -= 1;
    }
    //取栈顶元素,但不出栈
    int top()const
    {
        assert(!empty());
        return _data[_top];
    }
    //取栈顶元素并且出栈
    int gettop()
    {
        assert(!empty());
        return _data[_top--];
    }
};

int main()
{
    My_Stack st;
    st.resize(200);//效率更高,不需要反复增容
    for (int i = 0; i <100; ++i)
    {
        st.push(i);
    }
    while (!st.empty())
    {
        int x = st.gettop();
        cout << x << endl;
    }
    return 0;
}

若不仅仅想实现整型栈,还想在栈中放入double类型、char类型不同类型的数据,可以用模版来实现,代码如下:

#include
#include
#include
#include
#include

using namespace std;
enum { STACK_INIT_SIZE = 10, STACK_ISC_SIZE = 2 };
template 
class My_Stack
{
private:
    int _size;
    T * _data;
    int _top;
public:
    //构造函数
    My_Stack(const int sz = STACK_INIT_SIZE)
        : _size(sz),_data(nullptr), _top(-1)
    {
        _data = (T*)malloc(sizeof(T) * _size);
        if (nullptr == _data)
        {
            exit(1);
        }
    }

    //析构函数
    ~My_Stack() 
    {
        free(_data);
        _data = nullptr;
        _size = 0;
        _top = -1;
    }
    //判断是否为空
    bool empty()const
    {
        return size() == 0;
    }
    //判断是否为满
    bool full() const
    {
        return size() == capc();
    }
    bool resize(size_t newsz)
    {
        if (newsz <= capc())
        {
            return true;
        }
        T* newdata = (T*)realloc(_data, sizeof(T) * newsz);
        if (nullptr == newdata)return false;
        _data = newdata;
        _size = newsz;
        return true;
    }
    //获取栈中元素个数
    T size()const
    {
        return _top + 1;
    }
    //得到栈的容量大小
    T capc()const
    {
        return _size;
    }
    //入栈
    bool push(const T val)
    {
        if (full()&&resize(capc()*STACK_ISC_SIZE))
        {
            return false;
        }
        _top += 1;
        _data[_top] = val;
        return true;
    }
    //出栈
    void pop()
    {
        if (empty())
        {
            cout << "stack empty" << endl;
        }
        _top -= 1;
    }
    //取栈顶元素,但不出栈
    T top()const
    {
        assert(!empty());
        return _data[_top];
    }
    //取栈顶元素并且出栈
    T gettop()
    {
        assert(!empty());
        return _data[_top--];
    }
};

int main()
{
    My_Stack st;
    st.resize(200);
    
    for(char i = 'A'; i <= 'Z'; ++i)
    {
        st.push(i);
    }
    while (!st.empty())
    {
        char x = st.gettop();
        cout << x << endl;
    }
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917117.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号