1、栈的定义
— 栈是一种特殊的线性表
— 它仅能在线性表的一段进行操作
栈顶(Top):是允许操作的一端,
栈底(Bottom):不允许操作的一端。
- 栈的特性是后进先出(last in first out),另外一种说法就是先进后出。
-
栈的操作
1、创建栈(Stack())
2、销毁栈(~Stack())
3、清空栈(clear())
4、进栈(push())
5、出栈(pop())
6、获取栈顶元素(top())
7、获取栈的大小(size()) -
栈的实现:因为它是一个抽象父类,因此其成员函数都为纯虚函数
Stack.h
#ifndef STACK_H
#define STACK_H
#include "Object.h"
namespace XiebsLib
{
template <typename T>
class Stack : public Object
{
public:
virtual void push(const T& e) = 0;
virtual void pop() = 0;
virtual T top()const = 0;
virtual void clear() = 0;
virtual int size()const = 0;
};
}
#endif // STACK_H
- 栈的顺序实现:
- StaticStack 的设计要点:
— 类模板,
1、使用原生数组作为栈的存储空间
2、使用模板参数决定栈的最大容量
StaticStack.h
#ifndef STATICSTACK_H
#define STATICSTACK_H
#include "Stack.h"
#include "Exception.h"
namespace XiebsLib
{
template <typename T, int N>
class StaticStack : public Stack<T>
{
protected:
T m_space[N];
int m_top;
int m_size;
public:
StaticStack()
{
m_top = -1;
m_size = 0;
}
int capacity()const
{
return N;
}
void push(const T& e)
{
if(m_size < N)
{
m_space[m_top + 1] = e;
m_top++;
m_size++;
}
else
{
THROW_EXCEPTION(InvalidOperationException, "No space in current Stack");
}
}
void pop()
{
if(m_size > 0)
{
m_top--;
m_size--;
}
else
{
THROW_EXCEPTION(InvalidOperationException, "No element in current Stack");
}
}
T top()const
{
if(m_size > 0)
{
return m_space[m_top];
}
else
{
THROW_EXCEPTION(InvalidOperationException, "No element in current Stack");
}
}
void clear()
{
m_top = -1;
m_size = 0;
}
int size()const
{
return m_size;
}
};
}
#endif // STATICSTACK_H
main.cpp
#include <iostream>
#include "StaticStack.h"
using namespace std;
using namespace XiebsLib;
int main()
{
StaticStack<int, 5> stack;
try
{
stack.pop();
}
catch (const Exception& e)
{
cout << e.message() << endl;
cout << e.location() << endl;
}
for(int i = 0; i < 5; i++)
{
stack.push(i);
}
while (stack.size() > 0)
{
cout << stack.top() << endl;
stack.pop();
}
cout << stack.size() << endl;
return 0;
}
小结:
1、栈是一种特殊的线性表
2、栈只允许在线性表的一端进行操作
3、StaticStack 使用原生数组作为内部存储空间
4、StaticStack 的最大容量由模板参数决定