ybt1203 括号匹配问题

版权声明:本文为博主原创文章,未经博主允许不得转载,不得用于商业用途。 https://blog.csdn.net/WDAJSNHC/article/details/82119253

ybt1203  括号匹配问题

时空限制    1000ms/64MB

【题目描述】

在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注。

【输入】

输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。

【输出】

对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。

【输入样例】

((ABCD(x)
)(rttyy())sss)(

【输出样例】

((ABCD(x)
$$
)(rttyy())sss)(
?            ?$

代码

法一:STL栈

#include<iostream>
#include<string>
#include<stack>
using namespace std;
string s,ans;

int main(){
	while (cin>>s){
		int len=s.size();
		stack<int> sk;
		ans = "";
		for (int i=0; i<len; i++){
			if (s[i]=='('){	//左括号,入栈
				sk.push(i);	//把左括号位置入栈
				ans+=" ";	//空格填充左括号位置
			}
			else if (s[i]==')'){	//右括号
				if (!sk.empty()) { sk.pop(); ans+=" "; }	//匹配,退栈,空格填充右括号位置
				else ans+="?";	//不匹配,?填充右括号位置
			}
			else ans+=" ";	//空格填充
		}
		while (!sk.empty()){
			ans[sk.top()]='$';	//把栈里未匹配左括号变为 $
			sk.pop();
		}
		cout<<s<<endl<<ans<<endl;
	}
	return 0;
}

法二:手动栈

#include<iostream>
#include<string>
using namespace std;
string s,ans;
int stack[105];

int main(){
	while (cin>>s){
		int len=s.size(),top=0;
		ans = "";
		for (int i=0; i<len; i++){
			if (s[i]=='('){	//左括号,入栈
				stack[++top]=i;	//把左括号位置入栈
				ans+=" ";	//空格填充左括号位置
			}
			else if (s[i]==')'){	//右括号
				if (top) top--,ans+=" ";	//匹配,退栈,空格填充右括号位置
				else ans+='?';	//不匹配,?填充右括号位置
			}
			else ans+=" ";	//空格填充
		}
		while (top) ans[stack[top--]]='$';	//把栈里未匹配左括号变为 $
		cout<<s<<endl<<ans<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/WDAJSNHC/article/details/82119253
今日推荐