题目1153:括号匹配问题
时间限制:1 秒
内存限制:32 兆
题目描述:
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用”$”标注,不能匹配的右括号用”?”标注.
- 输入:
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
注意:cin.getline(str,100)最多只能输入99个字符!
- 输出:
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由”$”,”?”和空格组成,”$”和”?”表示与之对应的左括号和右括号不能匹配。
- 样例输入:
)(rttyy())sss)(
- 样例输出:
)(rttyy())sss)( ? ?$
【分析】
1.当栈为空的时候,如果首先遇到的是右括号,就打印?
2.当栈不为空时,如果遇到左括号就进栈,就打印空格
3.当栈不为空时,如果遇到了右括号,那么就出栈,如上例,先进入两个左括号,然后遇到一个右括号就出栈,此时也打印空格
4.遇到大小写字母,也打印空格
5.最后栈如果不为空,栈中肯定存的全部都是左括号,因为遇到右括号可能是栈空,直接不进栈,或者左括号出栈直至栈空,最后遍历栈即可,直至栈空。
#include<iostream>
#include<stack>
using namespace std;
stack<int> ch;
char instr[100];
char oustr[100];
int main()
{
while(cin>>instr)
{
int i;
for(i=0;instr[i]!=0;i++)//字符不为空循环
{
if(instr[i]=='(')//左括号直接进栈
{
ch.push(i);//将数组下标i压入栈中;
oustr[i]=' ';//暂时将对应的输出字符串位置改为空格
}
else if(instr[i]==')')// 右括号进行判断,若栈空则无法匹配 置?
//栈 不空就出栈顶元素 注:栈不空,栈顶一定是左括号。
{
if(ch.empty()==false)
{
ch.pop();
oustr[i]=' ';
}
else oustr[i]='?';
}
else oustr[i]=' ';//非括号直接置为空格
}
while(!ch.empty())//栈中多余的一定全是左括号
{
oustr[ch.top()]='$';
ch.pop();
}
oustr[i]=0;
puts(instr);
puts(oustr);
}
return 0;
}