在蓝桥杯中有这样一道题:给定一串字符,不超过100个字符,中间可能包括括号、数字、字母、标点、空格,检测字符中是否存在对应的左括号和右括号,如果存在左括号和右括号,记录下来输出,统计一共出现了多少次成对括号。例如:输入的字符内容为((234)(456))那么输出就有三对括号分别对应的位置是2和6;7和11;1和12以此类推。
这是C语言竞赛中的题目,难度较高,现在把题目改简单一点便于使用Scratch编程来实现。给定一个只包含左右括号的合法括号序列(只有括号没有其他字符内容),按从左到右的顺序输出每对配对的括号出现的位置,序列从1开始编号。例如:输入(()())显示结果应为:1 6;2 3;4 5。
这道题目考查的知识点其实是顺序栈的算法,栈是仅能在表尾进行插入和删除操作的线性表。在栈的尾部插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从栈删除元素又称作出栈或退栈,它是把栈顶元素删除,使得其相邻的元素成为新的栈顶元素,用一个词语来形容栈就是后进先出。
针对这道题,利用列表,从左往右开始,遇到左括号,就把这个括号和对应的位置记录下来存入列表的第一位,当遇到右括号,就取出前一个左括号的位置,这样就完成了一次配对,然后把这个左括號从列表中删除。下面给大家绘制一张简单的示例图,注意后进先出原则:
第3个位置遇到了第1个右括号,那么前一个左括号是2,因此2和3配成一对,将这个左括号的2号位置从列表删除。继续向下寻找,在第5个位置遇到了第二个右括号,前一个左括号是4,因此4和5配成一对,将4位置的左括号删除,最后一个右括号和位置1左括号进行匹配。程序运行结束。
在代码中首先设置三个变量:答案、i、括号,一个列表:括号记录。用户根据提示信息(请输入一组括号)输入一串括号,将输入内容设置为回答。重复执行括号的字符数的次数,在每次的执过程中进行判断,当括号内的第i个字符=左括号,将左括号的位置记录在括号记录的列表中,如果括号内的第i个字符=右括号,那么记录下右括号的位置,同时从括号列表中提取左括号的位置进行成对输出,用分号隔开下一组数据。以此类推直到所有字符全部遍历完成。
目前程序对输入字符要求全部是括号,这降低了难度。原题那样还输入了数字、空格等其他字符的情况,该如何只提取括号呢?你能想到简单实现目标的方法吗?