栈的基本操作
栈的定义
栈(Stack)是只允许在一端进行插入或删除操作的线性表。
栈是限定仅在表的一端进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的站称为空栈。
栈的示意图
如图所示,栈中有三个元素插入元素(也称入栈,进栈,压栈)的顺序是a1,a2,a3,当需要删除元素,也称(出栈、弹栈)时只能删除a3。换言之,任何时刻出栈的元素都只能是栈顶元素,即最后入栈者最先出栈,所以栈中元素除了具有线性关系外,还具有后进先出的特性
栈的存储结构定义
#define MaxSize 100 //假设栈元素最多100个
typedef int STDataType; //定义栈的数据类型,假定为int
typedef struct Stack
{
STDataType* _a; //存放栈元素的数组
int _top; // 栈顶位置,栈顶元素在数组中的下标
int _capacity; // 容量
}Stack;
栈的初始化
初始化一个空栈只需将栈顶位置top置为-1
void StackInit(Stack* ps)
{
assert(ps);
ps->_capacity = MaxSize;
ps->_top = -1;
STDataType* Array = (STDataType*)malloc(sizeof(STDataType) * MaxSize);
assert(Array);
ps->_a = Array;
}
栈的判空
顺序栈的判空只需要判断top是否等于-1,如果空返回1,否则返回 0;
int StackEmpty(Stack* ps)
{
assert(ps);
return ps->_top==-1;
}
入栈
在栈中插入元素x,只需栈站点位置top+1,然后在top的位置填入元素x
void StackPush(Stack* ps, STDataType data)
{
assert(ps);
if (ps->_top+1 == ps->_capacity)
{
STDataType* Array = (STDataType*)realloc(ps->_a,sizeof(STDataType) * (MaxSize+ps->_capacity));
if (!Array)
{
perror("realloc fail");
return;
}
ps->_a = Array;
ps->_capacity += MaxSize;
}
ps->_a[++ps->_top] = data;
}
出栈
出栈操作只需取出栈顶元素,然后将栈顶位置top- 1
void StackPop(Stack* ps)
{
assert(ps);
if (StackEmpty(ps))
{
return;
}
else
ps->_top--;
}
读取栈顶元素
取栈顶元素只是将top位置的栈顶元素取出,并不修改栈顶位置
STDataType StackTop(Stack* ps)
{
assert(ps);
if (ps->_top == -1)
{
return 0;
}
else
{
return ps->_a[ps->_top];
}
}
栈中有效元素的个数
求栈中元素个数只需要返回栈顶top+1(因为其是从0开始存放位置的)
int StackSize(Stack* ps)
{
assert(ps);
return ps->_top + 1;
}
销毁栈
销毁栈只需要将容量和栈顶top置为0,再释放maloc的_a数组即可
void StackDestroy(Stack* ps)
{
assert(ps);
ps->_capacity = 0;
ps->_top = 0;
free(ps->_a);
ps->_a = NULL;
}
代码总览
//Stack.h
#include<iostream>
#include<assert.h>
#define MaxSize 10
using std::cout;
using std::endl;
using std::cin;
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
STDataType* _a;
int _top; // 栈顶
int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);
//Stack.cpp
#include"Stack.h"
//初始化栈
void StackInit(Stack* ps)
{
assert(ps);
ps->_capacity = MaxSize;
ps->_top = -1;
STDataType* Array = (STDataType*)malloc(sizeof(STDataType) * MaxSize);
assert(Array);
ps->_a = Array;
}
//入栈
void StackPush(Stack* ps, STDataType data)
{
assert(ps);
if (ps->_top+1 == ps->_capacity)
{
STDataType* Array = (STDataType*)realloc(ps->_a,sizeof(STDataType) * (MaxSize+ps->_capacity));
if (!Array)
{
perror("realloc fail");
return;
}
ps->_a = Array;
ps->_capacity += MaxSize;
}
ps->_a[++ps->_top] = data;
}
//出栈
void StackPop(Stack* ps)
{
assert(ps);
if (StackEmpty(ps))
{
return;
}
else
ps->_top--;
}
//获取栈顶元素
STDataType StackTop(Stack* ps)
{
assert(ps);
if (ps->_top == -1)
{
return 0;
}
else
{
return ps->_a[ps->_top];
}
}
// 获取栈中有效元素个数
int StackSize(Stack* ps)
{
assert(ps);
return ps->_top + 1;
}
// 判空
int StackEmpty(Stack* ps)
{
assert(ps);
return ps->_top==-1;
}
// 销毁栈
void StackDestroy(Stack* ps)
{
assert(ps);
ps->_capacity = 0;
ps->_top = 0;
free(ps->_a);
ps->_a = NULL;
}
//mian.cpp
#include"Stack.h"
int main()
{
Stack con;
StackInit(&con);
for (int i = 0; i < 2000; i++)
{
StackPush(&con, i);
}
cout << StackEmpty(&con) << " " << StackSize(&con) << endl << endl;
for (int i = 0; i < 2000; i++)
{
cout << StackTop(&con);
cout << endl;
cout<<StackSize(&con);
cout << endl << endl;
StackPop(&con);
}
StackDestroy(&con);
}