栈的特性:
后进先出/先进后出
栈的常见操作:
Push——压栈
Pop——出栈
Top——求栈顶
Empty——判断栈是否为空
Size——求栈中元素个数
动态栈的模拟实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
template<class T>
class Stack
{
public:
Stack() //构造函数
: _arr(NULL)
, _size(0)
, _capacity(0)
{}
Stack(const Stack<T>& s) //拷贝构造函数
: _arr(NULL)
, _size(s._size)
, _capacity(s._capacity)
{
_arr = new int[s._capacity];
for (size_t i = 0; i < s._size(); ++i)
{
_arr[i] = s._arr[i];
}
}
Stack<T>& operator=(const Stack<T>& s) //赋值运算符重载
{
if (this != &s)
{
_capacity = _capacity * 2 + 3;
T * tmp = new int[s._capacity];
for (size_t i = 0; i < s._size; ++i)
{
_arr[i] = s._arr[i];
}
delete _arr;
arr = tmp;
_size = s._size;
_capacity = s._capacity;
}
return *this;
}
~Stack() //析构函数
{
delete []_arr;
_arr = NULL;
_size = 0;
_capacity = 0;
}
public:
void CheckCapacity()
{
if (_size >= _capacity)
{
T* tmp = new int[2 * _capacity + 3];
for (size_t i = 0; i < _size; ++i)
{
tmp[i] = _arr[i];
}
delete[] _arr;
_arr = tmp;
_capacity = 2 * _capacity + 3;
}
}
void Push(const T& data) //压栈
{
CheckCapacity();
_arr[_size] = data;
++_size;
}
void Pop()
{
assert(_arr);
--_size;
}
T& Top()
{
return _arr[_size - 1];
}
const T& Top()const
{
return _arr[_size - 1];
}
size_t Size()
{
return _size;
}
bool Empty()
{
return _size == 0;
}
protected:
T *_arr;
size_t _size; //栈中有效元素的个数
size_t _capacity; //栈的总容量
};
void TestStack()
{
Stack<int> s1;
s1.Push(1);
s1.Push(2);
s1.Push(4);
s1.Push(3);
s1.Push(5);
cout << s1.Size() << endl;
while (!s1.Empty())
{
cout << s1.Top() << " ";
s1.Pop();
}
}
#include<iostream>
using namespace std;
#include "stack.h"
int main()
{
TestStack();
system("pause");
return 0;
}