栈的知识点
栈的特点:
栈只能操作栈顶,除栈顶外的元素都不可以操纵
数据后进先出,数据始终插入在栈顶,移除也只能先移除栈顶
![](https://i-blog.csdnimg.cn/blog_migrate/ec523e715be789b74c249fd1810b3532.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eef7e843eddf8539f7d7ea1309cf9edb.png)
Stack
Stack.h
#ifndef __Stack_H_
#define __Stack_H_
#include "Object.h"
namespace JYlib
{
/*
抽象父类 栈(后进后出)
*/
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()=0;
};
}
#endif
StaticStack
静态栈的特点:
栈容量大小固定(通过模板参数确定)
栈内的数据是拷贝过来的,与原对象无关
静态栈初始化时,(原生数组)会进行无参构造,数据加入时发生拷贝构造效率低下
StaticStack.h
#ifndef __StaticStack_H_
#define __StaticStack_H_
#include "Stack.h"
#include "Exception.h"
namespace JYlib
{
/*
顺序栈
*/
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()
{
return N;
}
void push(const T& e)
{
if(m_size < N)
{
m_space[m_top + 1] = e;
m_top++;
m_size++;
}
else
{
THROW_EXCEPTION(Invalid0ParameterException,"No space in current stack ...");
}
}
void pop()
{
if(m_size > 0)
{
m_top--;
m_size--;
}
else
{
THROW_EXCEPTION(Invalid0ParameterException,"No element in current stack ...");
}
}
T top()const
{
if(m_size > 0)
{
return m_space[m_top];
}
else
{
THROW_EXCEPTION(Invalid0ParameterException,"No element in current stack ...");
}
}
void clear()
{
m_top = -1;
m_size = 0;
}
int size()
{
return m_size;
}
~StaticStack()
{
}
};
}
#endif
LinkStack
链式栈的特点:
组合使用LinkList,使得栈容量大小可以一直拓展
栈内的数据是通过链表指针指向的,与原对象有关
链式栈初始化时,仅仅是初始化链表,与指针指向数据,避免了无参构造以及拷贝构造,效率高
LinkStack.h
#ifndef __LinkStack_H_
#define __LinkStack_H_
#include "Stack.h"
#include "LinkList.h"
#include "Exception.h"
namespace JYlib
{
/*
链式栈
组合使用链表,类对象时效率高,避免创建时的构造与析构
*/
template < typename T >
class LinkStack : public Stack<T>
{
protected:
LinkList<T> m_list;
public:
LinkStack()
{
}
void push(const T& e)
{
m_list.insert(0,e);
}
void pop()
{
if(m_list.length() > 0)
{
m_list.remove(0);
}
else
{
THROW_EXCEPTION(InvalidParameterException,"No element in current stack ...");
}
}
T top()const
{
if(m_list.length() > 0)
{
return m_list.get(0);
}
else
{
THROW_EXCEPTION(InvalidParameterException,"No element in current stack ...");
}
}
void clear()
{
m_list.clear();
}
int size()
{
return m_list.length();
}
~LinkStack()
{
}
};
}
#endif