題目連接https://www.luogu.org/problemnew/show/P1739spa
假設一個表達式有英文字母(小寫)、運算符(+,—,*,/)和左右小(圓)括號構成,以「@」做爲表達式的結束符。請編寫一個程序檢查表達式中的左右圓括號是否匹配,若匹配,則返回「YES」;不然返回「NO」。表達式長度小於255,左圓括號少於20個。code
輸入格式:blog
一行:表達式字符串
輸出格式:io
一行:「YES」 或「NO」class
輸出樣例#1:程序
YES
表達式長度小於255,左圓括號少於20個統計
分析:能夠在掃描字符串的過程當中,用棧來存儲左括號,遇到右括號則將棧頂的左括號彈出棧。直接模擬便可。英文
或者能夠記錄掃描過程當中遇到的還沒有被右括號抵消掉的左括號還剩下多少個。就是:掃描時遇到左括號則累計增長左括號個數,遇到右括號則將左括號累計個數減掉1個。di
下面用棧來處理:
1 #include <stdio.h> 2 int main() 3 { 4 int s[100];//棧 5 char a[300];//表達式 6 int i,j,flag=0;//flag==0表示括號匹配,不然不匹配 7 scanf("%s",a); 8 9 j=-1; 10 for(i=0;a[i]!='@';i++) 11 { 12 if(a[i]=='(') 13 { 14 s[++j]=i;//遇到左括號則將下標入棧 15 } 16 else if(a[i]==')') 17 { 18 if(j>=0)//棧不爲空 19 j--; 20 else 21 { 22 flag=1;//匹配失敗 23 break; 24 } 25 } 26 } 27 if(j>=0) //棧不爲空 28 flag=1; 29 if(flag==1) 30 printf("NO\n"); 31 else 32 printf("YES\n"); 33 return 0; 34 }
下面是劉俊東童鞋寫的一段代碼,就是統計目前剩餘未被抵消掉的括號
#include <stdio.h> int main() { char t; int i=0; while(scanf("%c",&t)!=EOF) { if(t=='(') i++; else if(t==')') { if(i<=0) {printf("NO"); return 0;} else i--; } } if(i==0) printf("YES"); else printf("NO"); return 0; }