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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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】