栈是一种线性群体,因此栈的数据可以用数组或链表来存储。
由于栈的访问特性,故直接用数组类和链表类来解决栈的问题是不合适的,而是需要专门设计栈类。
要完整地保存栈的信息,栈类的数据成员至少应该包括栈元素和栈顶指针。由于栈元素即可以用数组也可以用链表来存放,栈类的结构也就有了两种:基于数组和基于链表。基于数组时可以采用静态数组和动态数组。
栈的基本状态有:一般状态、栈空、栈满。当栈中没有元素时称为栈空;当栈中元素个数达到上限时,称为栈满;栈中有元素,但未达到栈满状态时,即处于一般状态。
无论采用那种数据结构,栈类中都应该包括下列基本操作:初始化、入栈、出栈、栈清空、访问栈顶元素、检测栈的状态(满、空)。
栈类模板:
#ifndef STACK_CLASS
#define STACK_CLASS
#include<iostream>
#include<cstdlib>
using namespace std;
const int MaxStackSize = 50;//栈的大小,即栈中元素的最大个数
//类的声明
template <clas T>
class Stack
{
private:
T stacklist[MaxStackSize];//数组,用于存放栈的元素
int top;//栈顶位置(数组下标)
public: Stack(void);//构造函数,初始化栈
void Push(const T& item);//将元素item压入栈
T Pop(void);//将栈顶元素弹出栈
void ClearStack(void);//将栈清空
T Peek(void)const;//访问栈顶元素
int StackEmpty(void)const;//测试是否栈满
int StackFull(void)const;//测试是否栈空
};
//类的实现
template<class T>
Stack<T>::Stack(void) :top(-1) //构造函数,栈顶初始化为-1
{}
template <class T>
void Stack<T>::Push(const T& item)//将元素item压入栈
{
if (top == MaxStackSize - 1)//如果栈满,程序终止
{
std::cerr << "Stack overflow!" << endl;
exit(1);
}
top++;//栈顶指针增1
stacklist[top]=item;//将新元素压入栈顶
}
template <class T> T Stack<T>::Pop(void) //将栈顶元素弹出栈
{
T temp; if (top == -1)//如果栈空,程序终止
{
std::cerr << "Attempt to pop empty stack!" << endl;
exit(1);
}
temp = stacklist[top];//取出栈顶元素
top--;//栈顶指针自减
return temp;//返回栈顶元素
}
template <class T> T Stack<T>::Peek(void)const //访问栈顶元素
{
if (top == -1) //如果栈空,程序终止
{
std::cerr << "Attempt to an empty statck!" << endl;
exit(1);
}
return stacklist[top];//返回栈顶元素
}
template <class T>
int Stack<T>::StackEmpty(void)const //测试栈是否为空
{
return top == -1;//如果栈空则返回TRUE,否则返回FALSE
}
template <class T> int Stack<T>::StackFull(void)const//测试是否满
{
return top == MaxStackSize - 1;//如果栈满则返回TRUE,否则返回FALSE
}
template <class T>
void Stack<T>::ClearStack(void)//清空栈
{ top = -1; }
#endif//STACK_CLASS