括号的匹配(简单)

来源:互联网 发布:软件杂志社官网 编辑:程序博客网 时间:2024/06/05 00:48

括号的匹配

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 7   Accepted Submission(s) : 5

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

假设一个表达式由英文字母(小写)、运算符(+、-、*、/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。假设表达式长度小于255,左圆括号小于20个。

Input

输入有多组测试数据,每组为一个表达式。

Output

对于每组表达式如果匹配输出“YES”,否则输出“NO”。

Sample Input

2*(x+y)/(1-x)@

Sample Output

YES
提供两组算法 
1://逐个字符判断 统计两种括号的个数 如果相等 则输出yes 
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
int main ()
{  string s;
  int c1,c2,i,len;
while(cin>>s)
  {  c1=c2=0;
      len=s.length();
      for(i=0;i<len;i++)
      {
          if(s[i]=='(') c1++;
          else if(s[i]==')') c2++;
            //else i++;
      }
      if(c1==c2)
        printf("YES\n");
      else
        printf("NO\n");
  }
    return 0;
}
2.利用栈
#include <iostream>
#include <string>
#include <string.h>
#include <cstdio>
using namespace std;
struct sstack
{
    char sign[10010];
    int top;
};
void initstack(sstack &s)//将栈顶置空
{
    s.top=-1;
}
bool isemptystack(sstack &s)// 判断栈是否为空
{
    return s.top==-1?1:0;
}
int pushstack(sstack &s,char c)//将元素压栈
{
    s.sign[++s.top]=c;
    return 1;
}
int popstack(sstack &s)//将元素弹出栈
{
    if(isemptystack(s))
        return 0;
    s.top--;
    return 1;
}
char topstack(sstack &s)//弹出栈顶元素
{
    if(isemptystack(s))
        return 0;
    return s.sign[s.top];
}
int main ()
{
    char str[270];
    sstack s;
    int i,len;
    bool flag;
    while(scanf("%s",str)!=EOF)
    {
        flag=1;
        len=strlen(str);
        initstack(s);
        for(i=0; i<len; i++)
        {
                if(str[i]=='(')
                {
                    pushstack(s,str[i]);
                }
                else if(str[i]==')')
                {
                    if(isemptystack(s)||topstack(s)!='(')   flag=0;
                    else popstack(s);
                }


        }
        if(!isemptystack(s))  //如果此时栈里面还有元素则不匹配
            flag=0;
        // cout<<flag<<endl;
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
原创粉丝点击