小组分享会

小组分享会

这次我分享的是一道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的变换是如图所示的

这个题使用的栈的思想就是关于入栈和出栈,还有就是栈的特点是先存的后处理(后入先出),正好符合括号对应时所需要的条件,也可以用它来判断回文字符串等等类似的问题

猜你喜欢

转载自blog.csdn.net/weixin_50948265/article/details/110942874
今日推荐