- 使用动态数组保存数据
- 栈满自动扩充数组容量
#pragma once
template <class T>
class MyStack
{
public:
MyStack(size_t n = 10);
~MyStack();
void Push(const T&);
void Pop();
T& Top() const;
bool IsEmpty() const;
size_t Size() const;
private:
size_t m_capacity;
int m_top;
T* m_ptrStack;
void __ExpanCapacity();
};
template <class T>
MyStack<T>::MyStack(size_t n) : m_capacity(n), m_top(-1)
{
if (n < 1)
{
throw "参数错误,容量必须大于1 ";
}
m_ptrStack = new T[n];
if (m_ptrStack == nullptr)
{
throw "系统错误,内存申请失败";
}
}
template <class T>
MyStack<T>::~MyStack()
{
if (m_ptrStack != nullptr)
delete[] m_ptrStack;
}
template<class T>
inline void MyStack<T>::Push(const T& item)
{
if (m_top == m_capacity - 1)
{
__ExpanCapacity();
}
m_ptrStack[++m_top] = item;
}
template<class T>
inline void MyStack<T>::Pop()
{
if (IsEmpty())
{
throw "空栈";
}
else
{
m_ptrStack[m_top--].~T();
}
}
template<class T>
inline T& MyStack<T>::Top() const
{
if (IsEmpty())
{
throw "空栈";
}
else
{
return m_ptrStack[m_top];
}
}
template<class T>
inline bool MyStack<T>::IsEmpty() const
{
return m_top == -1;
}
template<class T>
inline size_t MyStack<T>::Size() const
{
return m_top + 1;
}
template<class T>
inline void MyStack<T>::__ExpanCapacity()
{
T* temp = new T[2 * m_capacity];
if (temp == nullptr)
{
throw "系统错误";
}
std::copy(m_ptrStack, m_ptrStack + m_capacity, temp);
m_capacity *= 2;
delete[] m_ptrStack;
m_ptrStack = temp;
}
MyStack<int> stack(6);
stack.Push(1);
stack.Push(2);
stack.Push(3);
cout << stack.Top() << " size:" << stack.Size() << endl;
stack.Pop();
cout << stack.Top() << " size:" << stack.Size() << endl;
stack.Push(4);
stack.Push(5);
stack.Push(6);
stack.Push(7);
stack.Push(8);
stack.Push(9);
stack.Push(10);
stack.Push(1111);
cout << stack.Top() << " size:" << stack.Size() << endl;
stack.Pop();
while (!stack.IsEmpty())
{
cout << stack.Top() << " size:" << stack.Size() << endl;
stack.Pop();
}