栈
定义和特点
限定仅在表尾进行插入或删除操作的线性表
- 包含两类栈,存储结构不同:顺序栈、链栈
- 栈的操作特性:后进先出
- a1,为栈底元素;an,为栈顶元素。不含元素的空表为空栈
- 是操作受限制的线性表,
- 基本操作:入栈、出栈、读取栈顶元素值、建栈、判栈满或空等等
一、顺序栈的表示和实现
1.定义
利用一组地址连续的存储单元依次存放自栈底到栈顶的元素,同时附带指针指示栈顶元素在顺序栈中的位置。
顺序栈中数据元素和栈指针之间的对应关系图
2.顺序的栈基本操作的实现
实现代码:
#include <iostream>
using namespace std;
//顺序栈的表示和实现
typedef int SElemType;
//0.顺序栈的储存表示
#define MAXSIZE 100 //存储空间的初始分配
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用最大容量
}SqStack;
//1.初始化
void InitStack(SqStack &S)
{
//构造空栈S
S.base=new SElemType[MAXSIZE]; //动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base)
{
cout<<"储存分配失败"<<endl;
}
else
{
S.top=S.base; //top初始为base,空栈
S.stacksize=MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
cout<<"栈已经初始化\n\n"<<endl;
}
}
//2.判断栈是否为空
void StackEmpty(SqStack S)
{
if(S.top==S.base)
{
cout<<"该栈为空"<<endl;
}
else
{
cout<<"该栈非空"<<endl;
}
}
//3.求栈的长度
void StackLength(SqStack S)
{
int n;
n=S.top-S.base;
cout<<"该栈的长度为:"<<n<<endl;
}
//4.清空栈
void ClearStack(SqStack &S)
{
if(S.base)
{
S.top=S.base;
cout<<"该栈已被清空"<<endl;
}
}
//5.销毁栈
void DestroyStack(SqStack &S)
{
if(S.base)
{
delete[]S.base;
S.stacksize=0;
S.base=S.top=NULL;
cout<<"该栈已被销毁"<<endl