问题描述:
- 输入n个字符串,每个字符串包含任意个字符,这些字符是”(”、”)”、”{“、”}”、”[“、”]”中的任意一个。
- 求输入的这些字符串有多少对可以匹配的。字符串和自身匹配算1次,字符串a和b匹配、b也和a匹配,这样算两次。
- 输入:字符串个数n,n个字符串
- 输出:可以匹配的字符串对数。
输入样例:
5 (( )) [] } {
输出样例:
3
C/C++代码:
#include <stdio.h>
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
printf("请输入字符串的个数n:\n");
int n;
scanf("%d", &n);
printf("请依次输入n个字符串:\n");
string backets[n];
for(int i=0; i<n; i++)
cin >> backets[i];
int count = 0;
stack<char> s;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
for(unsigned int k=0; k<backets[i].size(); k++) {
if(!s.empty() && ((s.top() == '{' && backets[i][k] == '}') ||
(s.top() == '[' && backets[i][k] == ']') ||
(s.top() == '(' && backets[i][k] == ')')))
s.pop();
else
s.push(backets[i][k]);
}
for(unsigned int k=0; k<backets[j].size(); k++) {
if(!s.empty() && ((s.top() == '{' && backets[j][k] == '}') ||
(s.top() == '[' && backets[j][k] == ']') ||
(s.top() == '(' && backets[j][k] == ')')))
s.pop();
else
s.push(backets[i][k]);
}
if(s.empty())
count++;
while(!s.empty())
s.pop();
}
}
printf("共有%d对匹配的括号字符\n", count);
return 0;
}
/*****************
Data: 2018/7/22
Author: ZNM
*****************/