题目描述
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注。
#include<iostream>
#include<stack>
using namespace std;
int main()
{
char str[105];
char ans[105];
stack<char> s;
while(scanf("%s",str)!=EOF)
{
int i;
for(i=0;str[i]!=0;i++)
{
if(str[i]=='(')
{
s.push(i);
ans[i]=' ';
//这个空格占位很重要 要不结果不对 字符没对齐
}
else if(str[i]==')')
{
//这里有一个问题,判断栈中有没有左括号 不能直接s.top(),
// 因为若栈中没有元素的时候,直接top()会报错。
//使用empty() 这个是安全的 并且栈中只有左括号这一种元素,如果不为空就表明栈顶有左括号
if(!s.empty())
{
ans[i]=' ';
s.pop();
}
else
{
ans[i]='?';
}
}
else
{//其他字符
ans[i]=' ';
}
}
//处理完右括号后,若栈中还留存有左括号 这些左括号都是匹配失败的
while(s.size()!=0)
{
ans[s.top()]='$';
s.pop();
}
/*
这个题额外需要注意地方!
ans[i]要赋0代表字符串末尾。
否则尽管人眼看着一样,但会多输出空白导致结果错误!
*/
ans[i]=0;
printf("%s\n",str);
printf("%s\n",ans);
//puts()是一种输出字符串字符数组的方式,末尾自动换行,但有一个要求就是字符串必须以0结尾。
//其原理是把字符串末尾的0变成了\n,注意这里的0就是0,而不是带有引号的字符'0',务必记住!
// ans[i]=0;
// puts(ans);
}
return 0;
}