扩号匹配问题(信息学奥赛一本通-T1203)
生活随笔
收集整理的這篇文章主要介紹了
扩号匹配问题(信息学奥赛一本通-T1203)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
在某個字符串(長度不超過100)中有左括號、右括號和大小寫字母;規定(與常見的算數式子一樣)任何一個左括號都從內到外與在它右邊且距離最近的右括號匹配。寫一個程序,找到無法匹配的左括號和右括號,輸出原來字符串,并在下一行標出不能匹配的括號。不能匹配的左括號用"$"標注,不能匹配的右括號用"?"標注。
【輸入】
輸入包括多組數據,每組數據一行,包含一個字符串,只包含左右括號和大小寫字母,字符串長度不超過100。
【輸出】
對每組輸出數據,輸出兩行,第一行包含原始輸入字符,第二行由"$","?"和空格組成,"$"和"?"表示與之對應的左括號和右括號不能匹配。
【輸入樣例】
((ABCD(x)
)(rttyy())sss)(
【輸出樣例】
((ABCD(x)
$$
)(rttyy())sss)(
? ????????????$
【源程序】
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define PI acos(-1.0) #define E 1e-9 #define INF 0x3f3f3f3f #define LL long long const int MOD=1000000007; const int N=10000+5; const int dx[]= {-1,1,0,0}; const int dy[]= {0,0,-1,1}; using namespace std; char a[101],b[101]; stack<int> S; int main(){while(cin>>a){int len=strlen(a);for(int i=0;i<len;i++){if(a[i]=='('){S.push(i);b[i]=' ';}else if(a[i]==')'){if(!S.empty())//棧不為空{S.pop();b[i]=' ';}elseb[i]='?';}elseb[i]=' ';}while(!S.empty())//棧不為空{b[S.top()]='$';S.pop();}b[len]='\0';cout<<a<<endl;cout<<b<<endl;}return 0; }?
總結
以上是生活随笔為你收集整理的扩号匹配问题(信息学奥赛一本通-T1203)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 树形结构 —— 并查集 —— 并查集的删
- 下一篇: 数论 —— 快速幂