文章目录
- 🚩前言
- 1、栈的概念
- 2、栈的实现框架
- 3、栈的代码实现
- 3.1、栈的初始化和销毁
- 3.2、入栈\出栈\返回栈顶元素\元素个数\判空
- 3.3、栈定义注意事项
- 4、栈的应用实例——《括号匹配问题》
🚩前言
前面记录了关于顺序表和链表的数据结构,这一篇文章就来说一下“栈”这一个数据结构。当然不是什么龙门客栈了哈哈。接下来就来实现一下栈这个结构吧,并用实例来展示栈的应用!✌
1、栈的概念
栈 :一种特殊的线性表,在存储数据的时候和顺序表以及单链表有所区别。我们通过图来展示:
2、栈的实现框架
3、栈的代码实现
该栈的实现是用顺序表的结构,模拟实现栈。
3.1、栈的初始化和销毁
void STInit(ST* pst)
{
assert(pst);
pst->a = NULL;//此处可以给空间,也可以先不给,
//在插入的时候再给。
pst->capacity = 0;
pst->size = 0;
}
void STDestory(ST* pst)
{
assert(pst);
free(pst->a);
pst->a = NULL;
pst->capacity = 0;
pst->size = 0;
}
3.2、入栈\出栈\返回栈顶元素\元素个数\判空
void STPush(ST* pst, STDataType data)
{
assert(pst);
if (pst->top == pst->capacity)
{
int NewCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
STDataType* tmp =
(STDataType*)realloc(pst->a,NewCapacity*sizeof(STDataType));
if (tmp == NULL)
{
perror("STPush::realloc fail!");
return;
}
else
{
pst->a = tmp;
pst->capacity = NewCapacity;
}
}
pst->a[pst->top++]=data;
}
void STPop(ST* pst)
{
assert(pst && pst->top > 0);
pst->top--;
}
STDataType STTop(ST* pst)
{
assert(pst&&pst->top);
return pst->a[pst->top - 1];
}
int STSize(ST st)
{
assert(&st);
return st.top;
}
bool STEmpty(ST st)
{
assert(&st);
return st.top == 0;
}
3.3、栈定义注意事项
①对于top初值的大小:
4、栈的应用实例——《括号匹配问题》
oj括号匹配问题
思路:
①首先括号匹配需要考虑两个点:数量上匹配和方向上匹配(左括号要匹配右括号)。
②利用栈结构实现该题:只要是左括号(全部类型的),就入栈;如果遇到右括号,则出栈顶元素(也就是和栈顶左括号进行匹配)。在这我们直接判断不匹配是情况,就是只判断不匹配情况,匹配的情况不用管。
代码如下:
bool isValid(char* s) {
ST st;
STInit(&st);
while(*s!='\0')
{
if((*s=='(') || (*s=='{') || (*s=='['))
{
STPush(&st,*s);
}
else
{
if(STEmpty(&st))
{
return false;
STDestory(&st);
}
DataType ret=GetTopElement(&st);
STPop(&st);
if((ret == '(' && *s != ')')
||(ret == '{' && *s != '}')
||(ret == '[' && *s != ']'))
{
return false;
}
}
s++;
}
return STEmpty(&st);
STDestory(&st);
}