7、群体类和群体数据的组织-4、顺序访问群体--栈类

栈是一种线性群体,因此栈的数据可以用数组或链表来存储。

由于栈的访问特性,故直接用数组类和链表类来解决栈的问题是不合适的,而是需要专门设计栈类。

要完整地保存栈的信息,栈类的数据成员至少应该包括栈元素和栈顶指针。由于栈元素即可以用数组也可以用链表来存放,栈类的结构也就有了两种:基于数组和基于链表。基于数组时可以采用静态数组和动态数组。

栈的基本状态有:一般状态、栈空、栈满。当栈中没有元素时称为栈空;当栈中元素个数达到上限时,称为栈满;栈中有元素,但未达到栈满状态时,即处于一般状态。

无论采用那种数据结构,栈类中都应该包括下列基本操作:初始化、入栈、出栈、栈清空、访问栈顶元素、检测栈的状态(满、空)。

栈类模板:

#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

 

posted on 2017-01-18 20:08  gary_123  阅读(303)  评论(0编辑  收藏  举报

导航