題目描述
在某個字符串(長度不超過100)中有左括號、右括號和大小寫字母;規定(與常見的算數式子一樣)任何一個左括號都從內到外與在它右邊且距離最近的右括號匹配。寫一個程序,找到無法匹配的左括號和右括號,輸出原來字符串,並在下一行標出不能匹配的括號。不能匹配的左括號用"$"標注,不能匹配的右括號用"?"標注。
輸入
輸入包括多組數據,每組數據一行,包含一個字符串,只包含左右括號和大小寫字母,字符串長度不超過100。
注意:cin.getline(str,100)最多只能輸入99個字符!
輸出
對每組輸出數據,輸出兩行,第一行包含原始輸入字符,第二行由"$","?"和空格組成,"$"和"?"表示與之對應的左括號和右括號不能匹配。
樣例輸入
bge)))))))))
((IIII))))))
()()()()(uuu
))))UUUU((()
樣例輸出
bge)))))))))
?????????
((IIII))))))
????
()()()()(uuu
$
))))UUUU((()
???? $$
提示 [+]
*** 提示已隱藏,點擊上方 [+] 可顯示 ***
來源
2010年北京大學計算機研究生機試真題
【思路】:
[cpp]
/*********************************
* 日期:2013-3-15
* 作者:SJF0115
* 題號: 天勤OJ 題目1072: 括號匹配問題
* 來源:http://www.acmclub.com/problem.php?id=1072
* 結果:AC
* 來源:2010年北京大學計算機研究生機試真題
* 總結:
**********************************/
#include<stdio.h>
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;
int main(){
int i;
char str[101],Mark[101];
while(scanf("%s",str) != EOF){
stack<char> S;
for(i = 0;i < strlen(str);i++){
//如果是'('則入棧
if(str[i] == '('){
//將數組下表暫存在棧中
S.push(i);
//對應輸出字符串暫且為' '
Mark[i] = ' ';
}
else if(str[i] == ')'){
//如果沒有'('相匹配
if(S.empty()){
//對應輸出字符串改為'?'
Mark[i] = '?';
}
//有'('相匹配
else{
//對應輸出字符串改為' '
Mark[i] = ' ';
//棧頂位置左括號與其匹配,彈出已經匹配的左括號
S.pop();
}
}
//其他字符需許考慮,與括號無關
else{
Mark[i] = ' ';
}
}//for
//若棧非空,則有沒有匹配的左括號
while(!S.empty()){
//對應輸出字符串改為'$'
Mark[S.top()] = '$';
S.pop();
}
Mark[i] = '\0';
//輸出
puts(str);
puts(Mark);
}
return 0;
}
/*********************************
* 日期:2013-3-15
* 作者:SJF0115
* 題號: 天勤OJ 題目1072: 括號匹配問題
* 來源:http://www.acmclub.com/problem.php?id=1072
* 結果:AC
* 來源:2010年北京大學計算機研究生機試真題
* 總結:
**********************************/
#include<stdio.h>
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;
int main(){
int i;
char str[101],Mark[101];
while(scanf("%s",str) != EOF){
stack<char> S;
for(i = 0;i < strlen(str);i++){
//如果是'('則入棧
if(str[i] == '('){
//將數組下表暫存在棧中
S.push(i);
//對應輸出字符串暫且為' '
Mark[i] = ' ';
}
else if(str[i] == ')'){
//如果沒有'('相匹配
if(S.empty()){
//對應輸出字符串改為'?'
Mark[i] = '?';
}
//有'('相匹配
else{
//對應輸出字符串改為' '
Mark[i] = ' ';
//棧頂位置左括號與其匹配,彈出已經匹配的左括號
S.pop();
}
}
//其他字符需許考慮,與括號無關
else{
Mark[i] = ' ';
}
}//for
//若棧非空,則有沒有匹配的左括號
while(!S.empty()){
//對應輸出字符串改為'$'
Mark[S.top()] = '$';
S.pop();
}
Mark[i] = '\0';
//輸出
puts(str);
puts(Mark);
}
return 0;
}