【TFLSnoi李志帥】第三篇文章
阿新 • • 發佈:2020-08-19
滿分程式碼,建議可以允許儘量不要直接copy,不喜勿噴嗷~
1353:表示式括號匹配(stack)
時間限制: 1000 ms 記憶體限制: 65536 KB
提交數: 11556 通過數: 6141
【題目描述】
假設一個表示式有英文字母(小寫)、運算子(+,—,∗,/)和左右小(圓)括號構成,以“@”作為表示式的結束符。請編寫一個程式檢查表示式中的左右圓括號是否匹配,若匹配,則返回“YES”;否則返回“NO”。表示式長度小於255,左圓括號少於20個。
【輸入】
一行資料,即表示式。
【輸出】
一行,即“YES” 或“NO”。
【輸入樣例】
2*(x+y)/(1-x)@
【輸出樣例】
YES
【提示】
【樣例輸入2】
(25+x)*(a*(a+b+b)@
【樣例輸出2】
NO
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
1 #include <bits/stdc++.h> 2 using namespace std; 3 char sta[300];//本題要用到棧 4 int t=0; 5 void push(char x) 6 { 7 sta[++t]=x; 8 } 9 void pop() 10 { 11 t--; 12 } 13 bool empty() 14 { 15 return t==0?1:0;//特殊宣告:t==0?1:0 換一種寫法是 if(t==0)return 1;else return 0; 16 } 17 int top() 18 { 19 returnsta[t]; 20 } 21 void clear() 22 { 23 t=0; 24 } 25 int size() 26 { 27 return t; 28 } 29 int main() 30 { 31 char a[300]; 32 int sum=0,flag=1; 33 gets(a); 34 sum=strlen(a); //獲取字串a的長度 35 for(int i=0;i<sum;i++) 36 { 37 if(a[i]=='(')push(a[i]); 38 if(a[i]==')'){ 39 if(top()=='(')//一一對應括號,不需要管其它數字運算子 40 pop(); 41 else{ 42 flag=0;//當括號無法一一對應時,直接跳出迴圈,輸出“NO”,flag作為判斷旗幟,int冒充bool型別(嘿嘿 43 break; 44 } 45 } 46 } 47 if(empty()==0)flag=0;//判斷另一種特殊情況:左括號數量大於右括號; 48 if(flag)cout<<"YES"; 49 else cout<<"NO"; 50 return 0; 51 }