Stack顺序栈(C++实现)

前言

大家好我是東木,在CSDN上持续更新更多原创文章,唯一指定传送门:東木的博客

本文将分享一下自己用C++实现myStack类(数组)。其private部分包括一个记录数组大小变量m_bufferSize,还有一个T类型的指针,有一个m_top记录栈顶,常量onceAlloc为一次分配时候的空间大小。在此Header file中,在本文我不采取C++的异常机制。程序有不足的地方还请大家多多指正!

代码块

//
// Created by dongMu on 2020/9/29.
//

#ifndef _myStack_H
#define _myStack_H

#include "bits/stdc++.h"
#include <ciso646>

using namespace std;

template<class T>
class myStack {
private:
    T *ptr_data;//指向一块内存空间的指针
    int m_bufferSize;//buffer的大小
    int m_top;//栈顶位置
    const int onceAlloc;//达到某个特定条件后,重新多余分配的空间大小
public:
    //构造函数
    myStack(int new_bufferSize = 0);

    //拷贝构造函数
    myStack(const myStack<T> &stack);

    //拷贝赋值
    myStack<T> &operator=(const myStack<T> &stack);

    //析构函数
    ~myStack();

    //入栈
    bool push(T const &val);

    //出栈
    bool pop();

    //判断空
    inline bool is_empty() const{ return (m_top == 0); }

    //判断满
    inline bool is_full() const{ return (m_bufferSize == m_top); }

    //只读栈的长度1
    inline int size() const{
        cout << m_top << endl;
        return m_top;
    }

    //只读栈的长度2
    inline int length() const{
        cout << m_top << endl;
        return m_top;
    }

    //只读栈顶元素
    inline T get_top() const{
        if (!is_empty()){
            cout << ptr_data[m_top-1] << endl;
            return ptr_data[m_top-1];
        }
    }

    //只读m_bufferSize
    inline int get_bufferSize()const{
        cout<<m_bufferSize<<endl;
        return m_bufferSize;
    }

    //摧毁栈
    inline bool destroy() {
        delete this;
        return true;
    }

};

template<class T>
inline
myStack<T>::myStack(int new_bufferSize):ptr_data(nullptr), m_bufferSize(new_bufferSize), m_top(0), onceAlloc(10) {
    if (m_bufferSize < 0) {
        cout << "m_bufferSize不可小于0";

    } else {
        //申请一块空间
        ptr_data = new T[m_bufferSize];
    }

}

template<class T>
inline myStack<T>::myStack(const myStack<T> &stack1):ptr_data(nullptr), m_bufferSize(stack1.m_bufferSize), m_top(stack1.m_top), onceAlloc(10) {

    ptr_data = new T[m_bufferSize];
    //将原来的复制到新的空间去
    memcpy(ptr_data, stack1.ptr_data, stack1.m_top * sizeof(T));

}

template<class T>
inline myStack<T> &myStack<T>::operator=(const myStack<T> &stack1) {
    if (this == &stack1) {
        return *this;
    } else {
        //清除ptr_data原来所指的空间
        delete[]ptr_data;
        m_bufferSize = stack1.m_bufferSize;
        this->m_top = stack1.m_top;
        ptr_data = new T[m_bufferSize];
        //将原来的复制到新的空间去
        memcpy(ptr_data, stack1.ptr_data, stack1.m_top * sizeof(T));
    }
    return *this;
}

template<class T>
inline myStack<T>::~myStack() {
    //摧毁原来ptr_data指针所指的空间
    delete[]ptr_data;
    //指针指向空
    ptr_data = nullptr;
}

template<class T>
bool myStack<T>::push(const T &val) {

    if (m_top < m_bufferSize) {
        //入栈
        ptr_data[m_top++] = val;
    } else {
        //重新申请空间
        T *new_ptr_data = new T[m_bufferSize + onceAlloc];
        //将原来的复制到新的空间去
        memcpy(new_ptr_data, ptr_data, m_top * sizeof(T));
        //m_bufferSize扩增
        m_bufferSize = m_top + onceAlloc;
        //入栈
        new_ptr_data[m_top++] = val;
        //摧毁原来ptr_data指针所指的空间
        delete[]ptr_data;
        //ptr_data和new_ptr_data指向同一个地方,函数结束后,new_ptr_data临时变量的生命将结束
        ptr_data = new_ptr_data;
    }

    return true;
}

template<class T>
bool myStack<T>::pop() {
    if (--m_top == m_bufferSize - onceAlloc) {
        //m_bufferSize变化
        m_bufferSize = m_bufferSize  - onceAlloc;
        //重新申请空间
        T *new_ptr_data = new T[m_bufferSize];
        //将原来的复制到新的空间去
        memcpy(new_ptr_data, ptr_data, m_top * sizeof(T));

        delete[]ptr_data;
        //ptr_data和new_ptr_data指向同一个地方,函数结束后,new_ptr_data临时变量的生命将结束
        ptr_data = new_ptr_data;
    } else {
        ptr_data[m_top+1]=0;
    }

    return true;
}


#endif //_myStack_H

参考资料

1.用C++实现Stack堆栈
2.侯捷高级OOP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值