栈的定义
-栈是一种特殊的线性表
-栈仅能在线性表的一端进行操作
·栈顶(Top):允许操作的一端
·栈底(Bottom):不允许操作的一段
栈的特性
-后进先出
栈的操作
-创建栈(Stack())
-销毁栈(~Stack())
-清空栈(clear())
-进栈(push())
-出栈(pop())
-获取栈顶元素(top())
-获取栈的大小(size())
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;
};
StaticStack设计要点
-类模板
·使用原生数组作为栈的存储空间
·使用模板参数决定栈的最大容量
template <typename T,int N>
class StataicStack : public Stack<T>
{
protected:
T m_space[N]; //栈存储空间,N为模板参数
int m_top; //栈顶标识
int m_size; //当前栈的大小
public:
StaticStack(); //初始化成员变量
int capacity() const;
//...
};
-栈是一种特殊的线性表
-栈只允许在线性表的一端进行操作
-StaticStack使用原生数组作为内存存储空间
-StaticStack的最大容量由模板决定
链式栈的设计要点
-类模板,抽象父类Stack的直接子类
-在内部组合使用LinkList类,实现栈的链式存储
-只在单链表成员对象的头部进行操作
栈的应用实践
-符号匹配问题
·在C语言中有一些成对匹配出现的符号
~括号:(),[] ,{},<>
~引号:' ' ," "
算法思路
-第一个字符开始扫描
·当遇见普通字符时忽略
·当遇见左符号时压入栈中
·当遇见右符号时弹出栈顶符号,并进行匹配
-结束
·成功:所有字符臊面完毕,且栈为空
·失败:匹配失败或所有字符臊面完毕但栈非空