1 栈的顺序实现
1.1 示意图

1.2 StaticStack设计要点
类模板:
- 使用原生数组作为栈的存储空间。
- 使用模板参数决定栈的最大容量。
1.3 继承关系图

1.4 接口实现

2 代码实现
StaticStack.h
#ifndef STATICSTACK_H
#define STATICSTACK_H
#include "Stack.h"
#include "Exception.h"
namespace LemonLib {
template <typename T, int N>
class StaticStack : public Stack<T>
{
protected:
T m_sapce[N];
int m_top;
int m_size;
public:
StaticStack()
{
m_top = -1;
m_size = 0;
}
void push(const T& e)
{
if (m_size < N)
{
m_sapce[m_top + 1] = e; //之所以这里不直接m_space++是为了异常安全,防止赋值的过程中出现异常
m_top++;
m_size++;
}
else
{
THROW_EXCEPTION(InvalidOperationException, "No space in current stack...");
}
}
int capacity() const
{
return N;
}
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_sapce[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 LemonLib;
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())
{
cout << stack.top() << endl;
stack.pop();
}
return 0;
}
900

被折叠的 条评论
为什么被折叠?



