C++数组实现栈
栈是一种先进后出的数据结构,元素只能从栈顶入栈,只能从栈顶出栈,如一组数入栈顺序为:9 8 7 6 5,则出栈顺序为:5 6 7 8 9
入栈示意:
出栈示意:
这里用静态数组实现一个简易版本,主要实现接口如下:
top() | 获取栈顶元素 |
---|---|
pop() | 弹出栈顶元素 |
push() | 将元素压入栈中 |
如何入栈?
- 分配静态数组作为容器(也可以用动态数组),使用
m_size
表明栈内元素个数(初始为0),m_top
标识栈顶位置(初始为-1,插入时选择m_top+1
的位置,刚好为0,是数组起始位置) - 每次
push
新元素入栈后m_size
自增1,直至m_size
和模板参数N
相等时栈满
如何获取栈顶元素?
某次push
操作完成后,size
为站内元素个数,栈顶元素位置为size-1
,返回该位置数组元素即可
如何出栈?
- 先用
top
方法取得栈顶元素 m_top
和m_size
分别减1m_size
为 0 时即为栈空
#include <iostream>
#include <cassert>
template<typename T, int N>
class ArrayStack
{
private:
T m_array[N];
int m_size; //当前元素个数
int m_top; //栈顶元素下标
public:
ArrayStack() :
m_size(0),
m_top(-1)
{}
~ArrayStack() = default;
T top() const
{
if ( m_size > 0 )
{
return m_array[m_top];
}
else
{
throw std::out_of_range("no element in stack ...");
}
}
void pop()
{
if ( m_size > 0)
{
m_top--;
m_size--;
}
}
void push(const T& e)
{
if( m_size < N )
{
m_array[m_top + 1] = e;//为了异常安全,泛指类型T重载可能抛出异常
m_top++;//为了异常安全,赋值成功后再做++,保证栈状态正常
m_size++;
}
}
void clear()
{
m_top = -1;
m_size = 0;
}
int capacity() const
{
return N;
}
int size() const
{
return m_size;
}
};
int main()
{
ArrayStack<int, 5> array_stack;
for ( int i = 9; i > 4; i-- )
{
array_stack.push(i);
}
for ( int i = 0; i < 5; i++ )
{
std::cout << array_stack.top() << " ";
array_stack.pop();
}
std::cout << std::endl;
}
//运行结果
5 6 7 8 9
参考
- 狄泰软件学院:数据结构实战开发