概念
一种特殊的线性表,只能在固定的一端进行插入和删除操作,这个固定的一端称为栈顶,另外一端称为栈底,没有任何元素的栈称为空栈!!
栈的特性
先进后出或者说后进先出!!
另外,栈分为顺序栈以及链式栈。
栈的功能
将数据从一种序列改变为另外一种序列(改变数据序列)
栈的基本操作
动态顺序栈的结构体———>其中包括动态数组(_array),空间容量(_capacity)以及元素个数(_top)
typedef int DataType;
typedef struct StackD
{
DataType* _array;
int _capacity;
int _top;
}StackD;
栈的初始化
// 栈的初始化
void StackDInit(StackD* s, int capacity)
{
assert(s); //参数检测
s->_array = (DataType*)malloc(sizeof(DataType)* capacity); // 申请空间
if (NULL == s->_array) //判空
{
assert(0);
return;
}
s->_capacity = capacity; //重置容量
s->_top = 0; //无元素,top为零
}
入栈和出栈操作
// 入栈
void StackDPush(StackD* s, DataType data)
{
assert(s); //参数检测
if (s->_top < s->_capacity) //栈未满,直接入栈
{
s->_array[s->_top] = data;
s->_top++;
}
else //栈已满,扩容后再入栈
{
int capacity = 2 * s->_capacity;
s->_array = (DataType*)realloc(s->_array, sizeof(DataType)*capacity); //扩容
s->_capacity = capacity; //重置容量
s->_array[s->_top] = data; //入栈
s->_top++;
}
}
// 出栈
void StackDPop(StackD* s)
{
assert(s); //参数检测
if (StackDEmpty(s))
{
printf("栈已空,无法出栈!!\n");
return;
}
else //栈顶减一即出栈
s->_top--;
}
获取栈顶元素、获取栈中元素个数以及判断栈是否为空
// 获取栈顶元素
DataType StackDTop(StackD* s)
{
assert(s); //参数检测
if (StackDEmpty(s))
{
printf("栈已空,无栈顶元素!! \n");
return 0;
}
return s->_array[s->_top - 1];
}
// 获取栈中元素个数
int StackDSize(StackD* s)
{
assert(s);
return s->_top;
}
// 检测栈是否为空
int StackDEmpty(StackD* s)
{
assert(s);
if (0 == s->_top)
return 1;
else
return 0;
}
栈的应用
1、括号匹配问题!
2、逆波兰表达式(后缀表达式)问题!
3、迷宫问题!
想这三个问题的解决方式,记得关注一下哦!!或者点开我的主页,进行查看!!
三天之内解决以上问题!!!