洛谷題解 P1739 表示式括號匹配
阿新 • • 發佈:2021-11-27
題目描述
假設一個表示式有英文字母(小寫)、運算子(+,—,*,/)和左右小(圓)括號構成,以“@”作為表示式的結束符。請編寫一個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回“YES”;否則返回“NO”。表示式長度小於255,左圓括號少於20個。
輸入格式
一行:表示式
輸出格式
一行:“YES” 或“NO”
輸入輸出樣例
輸入 #1
2(x+y)/(1-x)@
輸出 #1
YES
輸入 #2
(25+x)(a*(a+b+b)@
輸出 #2
NO
說明/提示
表示式長度小於255,左圓括號少於20個
解題方法:
我們可以使用棧來解題。如果讀入一個左括號,則一定有一個右括號與其匹配。那麼,如果有左括號,把左括號壓入棧。如果有右括號,那麼把棧頂的左括號彈出棧。到最後,如果棧中什麼都沒有,說明表示式括號匹配。否則,如果棧有剩餘的括號,就不匹配,例如序列(()。如果棧中已經沒有括號了,但是讀入一個右括號,也是出錯的,例如序列())。
程式碼
#include<bits/stdc++.h> using namespace std; int main(){ stack<char>stk; int c; for(;;){ c=getchar(); if(c=='@'){ if(stk.size()==0)cout<<"YES"; else cout<<"NO"; return 0; } else if(c=='(')stk.push(c); else if(c==')'){ if(stk.size()==0){ cout<<"NO"; return 0; } if(stk.top()=='(')stk.pop(); } } }