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   gary_123  阅读(322)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示