《数据结构与算法》 青岛大学-王卓 栈(顺序存储)C++
栈:本质上依旧是线性表。
栈的定义:限定只能在表的一端进行插入和删除运算的线性表(只能在栈顶操作)。
栈的特点:后进先出(LIFO)原则。
1.数据类型:栈
2.存储方式:顺序存储
3.常用名称:顺序栈
(注:图片截取自《数据结构与算法》-青岛大学王卓bilibili视频)
/*
顺序栈
数据类型:栈
存储类型:顺序存储
功能:初始化、销毁、判断是否为空栈、栈的长度、取栈顶元素、置空栈、入栈、出栈
*/
#include<iostream>
using namespace std;
#define MAX_SIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status; // Status是函数的类型,其值是函数结果状态代码
typedef int SElemType; // 根据自己的数据类型进行定义
// 定义栈的结构体
typedef struct
{
SElemType* base; // 栈底指针
SElemType* top; // 栈顶指针
int stacksize; // 栈可用最大容量
}Sqstack;
// 栈初始化
Status InitStack(Sqstack& S)
{
S.base = new SElemType[MAX_SIZE]; // 分配内存,将栈底指针指向该内存
if (!S.base) exit(OVERFLOW); // 存储分配失败
S.top = S.base; // 栈顶指针 = 栈底指针
S.stacksize = MAX_SIZE;
return OK;
}
// 栈是否为空
Status StackEmpty(Sqstack S)
{
if (S.base == S.top) return TRUE;
else return FALSE;
}
// 栈的长度
int StackLength(Sqstack S)
{
return S.top - S.base;
}
// 清空栈
Status ClearStack(Sqstack &S)
{
if (S.base) S.top = S.base;
return OK;
}
// 销毁顺序栈
Status DestroyStack(Sqstack& S)
{
if (S.base)
{
delete S.base;
S.stacksize = 0;
S.base = S.top = NULL;
}
return OK;
}
// 入栈,压入栈顶
Status Push(Sqstack& S, SElemType e)
{
if (S.top - S.base == S.stacksize) return ERROR; // 栈满
*S.top++ = e; // 写入栈顶; 即 *S.top = e; S.top++;
return OK;
}
// 出栈,从栈顶取出
Status Pop(Sqstack& S, SElemType& e)
{
if (S.top == S.base) return ERROR; // 栈空
e = *--S.top; //栈顶指针-1, 再取指针所指的栈顶元素
return OK;
}
int main(int arg, char* argv[])
{
Sqstack S;
InitStack(S);
Push(S, 1);
Push(S, 5);
Push(S, 9);
Push(S, 3);
cout << StackEmpty(S) << endl;
int len = StackLength(S);
cout << len << endl;
int e;
while (len)
{
Pop(S, e);
cout << e << endl;
--len;
}
return 0;
}