【问题描述】
假设一个表达式由英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以“@”作为表达式的结束符。 请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。 假设表达式长度小于255,左圆括号少于20个。
【算法分析】假设输入的字符串存储在c中(char c[256])。 可以定义一个栈:char s[maxn+1];int top; 用它来存放表达式中从左往右的左圆括号(maxn=20)。
【算法思路】顺序(从左往右)扫描表达式的每个字符c[i],若是“( ”,则让它进栈;若遇到的是“)”,则让栈顶元素出栈; 当栈发生下溢或当表达式处理完毕而栈非空时,都表示不匹配,返回“NO”;否则表示匹配,返回“YES”。
【代码分析】#include#include#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; }