小组分享会
这次我分享的是一道c语言的题,这个题涉及了一点点栈的思维,但总体来说是容易理解的
题目如下:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
解题代码如下:
#include<stdio.h>
#include<string.h>
#define MAX 100
int main(){
char stack[MAX],a[MAX];
int top=0,i;
stack[MAX]='c';
gets(a);
for(i=0;i<strlen(a);i++){
switch(stack[top]){
case '(':
if(a[i]==')'){
top--;
break;
}
case '[':
if(a[i]==']'){
top--;
break;
}
case '{':
if(a[i]=='}'){
top--;
break;
}
default:stack[++top]=a[i];
break;
}
}
if(top==0){
printf("true");
}
else
printf("false");
return 0;
}
经过实验,以上的五个例子都可以通过.
接下来进行讲解这道题,因为这道题涉及了字符,所以在最开始的使用了string.h头文件,然后宏定义了一个MAX为100;
现在进入主函数部分,前面的定义就不必解释太多,输入使用了gets进行输入,用scanf也可以
进入循环部分,for循环的结束条件是i < strlen(a),strlen(a)表示输入字符串的长度
for循环是遍历a数组,switch多支判断是判断括号是否一一对应,switch判断的是stack这个数组,为什么呢?
因为a数组是我们进行输入的数组,我们得保存着,不能对它进行删减,stack数组我们就直接进行增加删减对代码的影响不大
在switch里面的default的作用是当没有找到匹配的括号时,就把那个a[i]存进去,方便以后查找
接下来进行循环部分的解释
假设输入{[()]}
循环时:
因为default:stack[++top]=a[i];是++top,先执行++,所以stack数组从1开始读入,每次自加后才会进行写入,所以top的变换是如图所示的
这个题使用的栈的思想就是关于入栈和出栈,还有就是栈的特点是先存的后处理(后入先出),正好符合括号对应时所需要的条件,也可以用它来判断回文字符串等等类似的问题