1. 程式人生 > 實用技巧 >【TFLSnoi李志帥】第三篇文章

【TFLSnoi李志帥】第三篇文章

滿分程式碼,建議可以允許儘量不要直接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     return
sta[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 }