主要包含一些简单的实现,用C++的类作为封装, 其中包含一些细节问题,比如存储数据元素的栈在初始化的时候不能用初始化列表,需要new申请空间,所以用完之后自然需要delete释放空间。
class MyStack
{
private:
enum { STACK_INIT_SIZE = 10, STACK_INC_SIZE = 2 };//定义起始栈的大小为10,扩容增长为2倍
int* data;
int capacity;
int top;
public:
MyStack() :data(nullptr), capacity(STACK_INIT_SIZE), top(-1)
{
data = new int[capacity];
}
MyStack(int sz) :data(nullptr), capacity(sz), top(-1)
{
data = new int[capacity];
}
~MyStack()
{
delete[]data;
data = nullptr;
capacity = 0;
top = -1;
}
size_t Size()const
{
return top + 1;
}
bool Full()const
{
return capacity == Size();
}
bool Empty()const
{
return Size() == 0;
}
bool Push(int val)
{
if (Full() && Resize(capacity * STACK_INC_SIZE))return false;
data[++top] = val;
return true;
}
bool Pop()
{
if (!Empty())
{
top -= 1;
return true;
}
return false;
}
bool Resize(int new_sz)
{
if (new_sz < Size())
{
new_sz = 2*Size();
}
int* new_data = new int[new_sz];
int sz = Size();
memmove( new_data,data, sz * sizeof(int));
delete[]data;
capacity = new_sz;
data = new_data;
return true;
}
int Top() //获取栈顶元素
{
return data[top];
}
const int& Top()const
{
return data[top];
}
};
int main()
{
MyStack mys;
for (int i = 0; i < 100; i++)
{
cout << "push " << i << " " << mys.Push(i) << endl;
}
while (!mys.Empty())
{
int x = mys.Top();
mys.Pop();
cout << x << endl;
}
}