文章目录
- 🚩前言
- 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);
}