概述
栈是一种特殊的线性表,仅能在一端进行操作,栈顶(Top)允许操作的一端,栈底(Bottom),不允许操作的一端。
抽象父类
#ifndef STACK_H_
#define STACK_H_
#include "Object.h"
namespace MYLIB{
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
顺序栈的实现
#ifndef STATICSTACK_H_
#define STATICSTACK_H_
#include "Stack.h"
#include "Exception.h"
namespace MYLIB{
template <typename T,int N>
class StaticStack:public Stack<T>
{
protected:
T m_space[N]; // 栈空间的大小
int m_size; // 当前栈的大小
int m_top; // 栈顶标识
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 Enough space to push StaticStack");
}
}
void pop()
{
if (m_size > 0)
{
m_top--;
m_size--;
}
else
{
THROW_EXCEPTION(InvalidOperationException,"No Enough space to push StaticStack");
}
}
T top() const
{
if (m_size > 0 )
{
return m_space[m_top];
}
else
{
THROW_EXCEPTION(InvalidOperationException,"No Enough space to push StaticStack");
}
}
void clear()
{
m_top = -1;
m_size = 0;
}
int size()const
{
return m_size;
}
};
}
#endif
链式栈的实现
#ifndef LINKSTACK_H_
#define LINKSTACK_H_
#include "Stack.h"
#include "Exception.h"
#include "LinkList.h"
namespace MYLIB{
template <typename T>
class LinkStak:public Stack<T>
{
protected:
LinkList<T> m_list;
public:
void push(const T&e)
{
m_list.insert(0,e);
}
void pop()
{
if (m_list.length() > 0 )
{
m_list.remove(0);
}
else
{
THROW_EXCEPTION(InvalidOperationException,"No element in current LinkStack");
}
}
T top()const
{
if (m_list.length() > 0)
{
return m_list.get(0);
}
else
{
THROW_EXCEPTION(InvalidOperationException,"No element in current LinkStack");
}
}
void clear()
{
m_list.clear();
}
int size()const
{
return m_list.length();
}
};
}
#endif
栈的应用:
- 符号匹配
- 中缀表达式转后缀表达式
代码太简单了,不写了。。。。。。
总结:
顺序栈的存储空间使用的原生数组,但是原生数组作为存储空间的时候,在初始化的时,会调用相应类型的构造函数;这样即使不存储任何元素(m_size = 0),也会使得在定义栈的时候,先构造出 N 个大小为 T 的类型的空间出来,非常浪费效率;