【问题描述】
在某个字符串(长度不超过100)中有左、右括号和大小写字母;规定任何一个左括号都从内到外与在它右边且距离最近的有括号匹配。写一个程序,找到无法匹配的左右括号,输出原来字符串,并在下一行为不能匹配的左右括号做标记。不能匹配的左括号用“$”标记,不能匹配的右括号用“?”标记。成功匹配的直接显示为空格(即不做标记)。
【思考】
括号匹配问题是堆栈的典型应用之一,每一个右括号必定与其之前未被匹配的左括号里头最右边的那个匹配。我们可以从左到右遍历字符串,遇到左括号就压入堆栈等待匹配,遇到右括号就检查堆栈,若堆栈为空,则无法匹配,标记?,若堆栈非空,则匹配成功,全部扫面完成后,检查堆栈是否有余下的左括号未被匹配,有的话标记$即可。
【源码】
#include <stdio.h>
#include <stack>
using namespace std;
stack<int> S; //定义一个堆栈
char str[110];//保存输入字符串
char ans[110];//保存输出字符串
int main(){
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]==')'){//如遇右括号
if(S.empty()==false){//如果堆栈非空
S.pop();
ans[i]=' ';
}
else ans[i]='?'; //如果堆栈为空
}
else ans[i]=' ';//如遇其他字符
}
while(!S.empty()){//字符串遍历完成后,留在堆栈中的左括号无法匹配的话 ,修改器在输出中的位置为$
ans[S.top()]='$';
S.pop();//弹出
}
ans[i]=0;//为了使输出形成字符串,在其最后一个字符后添加一个空字符
//输出原字符串与答案字符串
puts(str);
puts(ans);
}
return 0;
}