栈的特点:先进后出,下面展现了其实现过程,具体代码如下:
#include#include using namespace std; enum { STACK_INIT_SIZE = 10, STACK_INC_SIZE = 2 };//给定初始容量为10,且按照2倍的增量来扩容 class MyStack { private: int* _data; //从堆区获取空间,如果定义成数组,没有办法扩容 int _capc; //容量 int _top; //栈顶 public: MyStack(int sz = STACK_INIT_SIZE) : _data(nullptr), _capc(sz), _top(-1) //栈的构造函数,获取资源,并进行初始化 { _data = new(nothrow) int[_capc]; //设置抛出异常时,用if来进行判空才有意义 if (nullptr == _data) { exit(1); } } ~MyStack() //栈的析构函数,释放资源 { delete[]_data; _data = nullptr;//释放之后,_data为失效指针,一定要将其置为空 _capc = 0; _top = -1; } int Size() const//当前元素的个数 常方法封锁指向能力 { return _top + 1;//即返回栈顶元素个数 } int Capc() const//容量 { return _capc; } bool Empty() const//判空 { return Size() == 0; } bool Full() const//判满 { return Size() == Capc(); } bool Resize(int newsz)//扩容操作 { if (newsz <= _capc) //如果当前容量小于原来的容量,则不需要扩容 { return true; } else { int* newdata = new(nothrow) int[newsz]; if(nullptr==newdata) { return false; } memmove(newdata, _data, sizeof(int) * Size());//将数据 _data移动到newdata,一个一个字节拷贝 delete[]_data; //将原有空间释放 _data = newdata; _capc = newsz; return true; } } bool Push(const int val) //入栈不能加const,因为要将数据放进去,若是加了const,则数据添加不进去 { if (Full()&&!Resize(Capc()*STACK_INC_SIZE))//如果栈满或者扩容失败时,则返回假 { return false; } else { _top += 1; _data[_top] = val; return true; } } int Top() const //返回栈顶元素 { if (!Empty()) { return _data[_top]; } } void Pop() //出栈 { _top -= 1; } int GetPop()//取栈顶元素和出栈合二为一 { assert(!Empty()); return _data[_top--];//_top--为后置--,即先将_top指向的这个数据取出来,再-- } }; int main() { MyStack mys; mys.Resize(10000);//用栈时,估算数据达到了1万,直接将其扩容到1万,进行优化 for (int i = 0; i < 10000; i++) { mys.Push(i); //入栈 } int x; while (!mys.Empty()) { x = mys.GetPop(); cout << x << endl; } return 0; }
运行结果:



