括号的匹配(表达式的合法性检查)
生活随笔
收集整理的這篇文章主要介紹了
括号的匹配(表达式的合法性检查)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】
假設一個表達式由英文字母(小寫)、運算符(+、-、*、/)和左右小(圓)括號構成,以“@”作為表達式的結束符。
請編寫一個程序檢查表達式中的左右圓括號是否匹配,若匹配,則返回“YES”;否則返回“NO”。
假設表達式長度小于255,左圓括號少于20個。
【算法分析】
假設輸入的字符串存儲在c中(char c[256])。
可以定義一個棧:char s[maxn+1];int top;
用它來存放表達式中從左往右的左圓括號(maxn=20)。
【算法思路】
順序(從左往右)掃描表達式的每個字符c[i],若是“( ”,則讓它進棧;若遇到的是“)”,則讓棧頂元素出棧;
當棧發生下溢或當表達式處理完畢而棧非空時,都表示不匹配,返回“NO”;否則表示匹配,返回“YES”。
【代碼分析】
#include <cstdio> #include <cstdlib> #define maxn 20 using namespace std; char c[256]; bool judge(char c[256]) {int top=0,i=0;while(c[i]!='@'){if(c[i]=='(') top++;if(c[i]==')'){if(top>0) top--;else return false;}i++;}if(top!=0) return false;//檢查棧是否為空,不空則說明有未匹配的括號。else return true; } int main () {scanf("%s",c);if(judge(c)) printf("YES");else printf("NO");return 0; }總結
以上是生活随笔為你收集整理的括号的匹配(表达式的合法性检查)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百练1089:数字反转
- 下一篇: 编程求一个后缀表达式的值