時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:3 描述
現在,有一行括號序列,請你檢查這行括號是否配對。
輸入第一行輸入乙個數n(0輸出
每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出yes,如果不配對則輸出no
樣例輸入
3[(])
(])([()])
樣例輸出
nonoyes
#include #include using namespace std;
int main()
else
}case ')':
else
}default:break;
}p++;
if(k==1)
break;
} if(0==str2.length()&&k==0) //k=1說明有右括號剩餘
cout << "yes" << endl;
else
cout << "no" << endl;
} return 0;
}
剛換c++,一時沒想到怎麼用棧(其實是資料結構學的還是個半吊子),就寫出這麼乙個玩意
不過,很多東西也是第一次用,就當擴充知識了
建立乙個字串,遇到左括號就寫入,遇到右括號就和字串的最後乙個字元進行判斷,如果有與之相匹配的括號,就從字串最後刪去左括號,否則就做個標記
(因為我的沒有存入右括號,第一次沒做標記,沒有考慮到右括號有剩餘的情況,考慮問題不全面)
p=&str[0]:str是string字串,再加上下標則為char型,char*型別的p才能正確訪問元素
str.length():獲取字串的實際長度,那麼再-1指向的就是最後乙個字元了
str.erase(str.length()-1):刪除字串最後乙個元素
拓展:
語法:iterator erase( iterator pos );iterator erase( iterator start, iterator end );
basic_string &erase( size_type index = 0, size_type num = npos );
erase()函式可以:
引數index 和 num 有預設值, 這意味著erase()可以這樣呼叫:只帶有index以刪除index後的所有字元,或者不帶有任何引數以刪除所有字元.此處使用的是第乙個用法,刪除了指定位置的字元
#include#include#includeusing namespace std;
int main()
{ int n;
cin>>n;
while(n--)
{ vectorvec;
string ch;
vec.push_back(' ');
cin>>ch;
for(int i=0;i
這裡用到了容器,push_back()表示在vector尾部插入乙個元素
看了好久,才醒悟過來這段**沒有一次性輸入完畢在進行判斷,而是邊輸入邊判斷,在中間做了輸出vec.back() - 1,發現輸出的是數字,猜測是ascii碼,最後查了ascii表才略懂判斷條件
開方括號[為93,閉方括號]為91,開圓括號(為40,閉圓括號)為41
vec.back()-1 == *(vec.end()-2)
判斷圓括號是否匹配,而
vec.back()-2 == *(vec.end()-2)
判斷方括號是否匹配
至於
vec.push_back(' ');
的作用,是因為每次需要判斷兩個元素,在只輸入乙個元素的時候,程式會炸裂= =在前面補個空
最後,檢驗猜想,輸入數字12、13,字母ab、ac等,都可判斷為yes,這說明這個程式的核心其實是判斷ascii值之差,差為1或2時為yes,否則為no
括號配對問題 2
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現在,有一行括號序列,請你檢查這行括號是否配對。輸入第一行輸入乙個數n 0輸出 每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出yes,如果不配對則輸出no 樣例輸入 3 樣例輸出 no noyes includ...
2 括號配對問題
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 現在,有一行括號序列,請你檢查這行括號是否配對。輸入第一行輸入乙個數n 0輸出 每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出yes,如果不配對則輸出no 樣例輸入 3 樣例輸出 no noyes includ...
2 括號配對問題
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述現在,有一行括號序列,請你檢查這行括號是否配對。輸入第一行輸入乙個數n 0輸出 每組輸入資料的輸出佔一行,如果該字串中所含的括號是配對的,則輸出yes,如果不配對則輸出no 樣例輸入 3 樣例輸出 no noyes include...