1353:表達式括號匹配(stack)
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 10067 通過數: 5352
【題目描述】
假設一個表達式有英文字母(小寫)、運算符(+,—,∗,/)和左右小(圓)括號構成,以“@”作爲表達式的結束符。請編寫一個程序檢查表達式中的左右圓括號是否匹配,若匹配,則返回“YES”;否則返回“NO”。表達式長度小於255,左圓括號少於20個。
【輸入】
一行數據,即表達式。
【輸出】
一行,即“YES” 或“NO”。
【輸入樣例】
2*(x+y)/(1-x)@
【輸出樣例】
YES
【提示】
【樣例輸入2】
(25+x)(a(a+b+b)@
【樣例輸出2】
NO
思路:利用棧,掃描字符c,若遇到‘(’進去,若遇到‘)’出去。注意兩種情況:棧發生下溢和表達式處理完畢但棧非空時,都是NO。其他則是匹配
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
char a[10001];
int i = 0,tot = 0;
cin >> a;
while(a[i] != '@')//循環知道@結束
{
if(a[i] == '(') tot++;//記錄左括號,表達式長度小於255
if(a[i] == ')')//記錄右括號
{
if(tot >= 0) tot--;
else break;
}
i++;
}
if(tot != 0) cout << "NO";
else cout << "YES";
}