34、栈的定义

栈是一种特殊的线性表

栈仅能在线性表的一端进行操作

栈顶(Top):允许操作的一端。

栈底(Bottom):不允许操作的一端。

栈的特性:后进先出(Last in First out)

栈的操作:创建栈(stack()),销毁栈(~Stack()),清空栈(~Stack()),清空栈(clear()),进栈(push(()),出栈(pop()),获取栈顶元素(top()),获取栈的大小(size()).

设计要点:类模板

使用原生数组作为栈的存储空间,使用模板参数决定栈的最大容量。

#ifndef STATICSTACK_H_
#define STATICSTACK_H_
#include "stack.h"
#include "Exception.h"
namespace WSlib
{
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;//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 space in current stack");
}
}
T top() const
{
if(m_size>0)
{
return m_space[m_top];
}
else
{
THROW_EXCEPTION(InvalidOperationException,"no space in current stack");
}
}
void clear()
{
m_top=-1;
m_size=0;
}
int size() const
{
return m_size;
}
};
}
#endif
/*******************************************************************************************
#include <iostream>
#include "StaticStack.h"
using namespace std;
using namespace WSlib;
int main()
{
    StaticStack<int,10> s;
try
{
s.pop();
}
catch(const Exception& e)
{
cout<<e.message()<<endl;
cout<<e.location()<<endl;
}
for(int i=0;i<10;i++)
{
s.push(i);
}
while(s.size()>0)
{
cout<<s.top()<<endl;
s.pop();
}
return 0;
}
*************************************************************************************/

小结:栈是一种特殊的线性表。栈只允许线性表的一端进行操作。StaticStack使用原生数组作为内部存储空间,StaticSack的最大容量由模板参数决定。

猜你喜欢

转载自blog.csdn.net/ws857707645/article/details/80460661
34