zoukankan      html  css  js  c++  java
  • 括号的匹配(表达式的合法性检查)

    【问题描述】

    假设一个表达式由英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以“@”作为表达式的结束符。
    请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“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;
    }
    
  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
    2. Add Two Numbers
    链式表的按序号查找
    可持久化线段树——区间更新hdu4348
    主席树——树链上第k大spoj COT
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12339451.html
Copyright © 2011-2022 走看看