题目如下:
判断一个字符序列中(与)、[与]、{与}是否配对且互不相交
分析:
如果只要求配对的话,直接统计这些字符的两两对应数目是否相等即可,
但关键点在于互不相交,互不相交是什么意思呢,离得最近的左右括号一定是相同类型的,去掉这两个括号,再按这个规则匹配,最后可以把括号全部去掉,那就是互不相交的
注意一点,写代码千万别乱复制粘贴,要认真仔细
写程序之前要先把思路理清,按照思路把代码写出来,毕竟代码就是展现你的思路的,思路清晰代码就清晰,思路混乱代码就一团糟
//题目:判断一个字符序列中(与)、[与]、{与}是否配对且互不相交
#include <stdio.h>
int main() {
char a[30], stack[30]; //a字符数组用于存字符串,stack字符数组模拟栈
int n = -1; //用于计数
int i, m = 0; //m用于对栈的记录
int sbracket = 1, mbracket = 1, lbracket = 1; //假设初始括号匹配
printf("本程序匹配括号及不可相交");
printf("请输入字符串,以‘#’结尾:\n"); //写入字符串
do {
n += 1;
scanf("%c", &a[n]);
} while (a[n] != '#');
for (i = 0; i <= n; i++) {
if (a[i] == '(' || a[i] == '[' || a[i] == '{') { //写入堆栈
stack[m] = a[i];
m += 1;
}
if (a[i] == ')' || a[i] == ']' || a[i] == '}') { //比较
if ((a[i] == ')'&&stack[m - 1] == '(') || (a[i] == ']'&&stack[m - 1] == '[') || (a[i] == '}'&&stack[m - 1] == '{')) {
m -= 1;
}
else {
printf("不符合条件!");
return 0;
}
}
}
if(m==0) //判断栈是否为空,若空则符合条件
printf("符合条件!\n");
else
printf("不符合条件!\n");
return 0;
}