【題目描述】
假設一個表達式有英文字母(小寫)和數字、運算符(+,—,*,/)和左右小(圓)括號構成,以“@”作爲表達式的結束符。請編寫一個程序檢查表達式中的左右圓括號是否匹配,若匹配,則返回“YES”;否則返回“NO”。表達式長度小於255,左圓括號少於20個。
【輸入格式】輸入文件包括一行數據,即表達式,
【輸出格式】
輸出文件包括一行,即“YES” 或“NO”。
【樣例輸入】
2*(x+y)/(1-x)@
【樣例輸出】
YES
分析:此題只需判斷括號是否匹配,其他的都不需要考慮,這樣可以把題簡化成只對括號的操作,那讓我們看看,不合法的括號有哪些
1:當出現')'後前面沒有相應的'('對應。
2:當整個表達式都判斷完了還有'('沒有相應的')'與之配對
所以算法可以這樣設計
1.對整個表達式進行遍歷,當爲非括號或括回時不做任何處理直接判斷下一字符
2.如果當前字符爲'('直接把它入棧
3.如果當前字符爲')'時,首先判斷棧是否爲空,如果爲空直接可以判定不匹配,如果非空,直接把棧頂元素出棧
4.當整個表達式遍歷完畢,如果當前棧爲空則表明是匹配,非空表明還有'('沒有相應的')' 相匹配
c++代碼
#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
string s;
stack<char> a;
bool my_judge(string);
int main()
{
cin>>s;
if(my_judge(s))cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
bool my_judge(string s)
{
int i=0;
while(s[i]!='@')
{
if(s[i]=='(')a.push(s[i]);
if(s[i]==')')
{
if(a.empty()) return false;
a.pop();
}
i++;
}
if(a.empty())return true;
else return false;
}