編程題#4:擴號匹配問題
來源: POJ (Coursera聲明:在POJ上完成的習題將不會計入Coursera的最后成績。)
注意: 總時間限制: 1000ms 內存限制: 65536kB
描述
在某個字符串(長度不超過100)中有左括號、右括號和大小寫字母;規定(與常見的算數式子一樣)任何一個左括號都從內到外與在它右邊且距離最近的右括號匹配。寫一個程序,找到無法匹配的左括號和右括號,輸出原來字符串,並在下一行標出不能匹配的括號。不能匹配的左括號用"$"標注,不能匹配的右括號用"?"標注.
輸入
輸入包括多組數據,每組數據一行,包含一個字符串,只包含左右括號和大小寫字母,字符串長度不超過100
注意:cin.getline(str,100)最多只能輸入99個字符!
輸出
對每組輸出數據,輸出兩行,第一行包含原始輸入字符,第二行由"$","?"和空格組成,"$"和"?"表示與之對應的左括號和右括號不能匹配。
樣例輸入
((ABCD(x) )(rttyy())sss)(
樣例輸出
((ABCD(x)
$$
)(rttyy())sss)(
? ?$
#include<iostream> #include<stdio.h> #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] = ' '; } } while (!S.empty()) { Mark[S.top()] = '$'; S.pop(); } Mark[i] = '\0'; puts(str); puts(Mark); } return 0; }