信息学奥赛一本通P350 stack

【问题描述】

  假设一个表达式由英文字母(小写)、运算符(+、-、*、/)和左右小括号组成,以“@”作为表达式的结束符。

请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出“YES”,反之,则输出“NO”。

  表达式长度小于255,括号数小于20.

【输入格式】

  输入文件stack.in,包括一行数据,即表达式。

【输出格式】

  输出文件stack.out,包括一行,即“YES”或“NO”.

【输入样例】

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

【输出样例】

  YES

 

这是我打的代码:

#include<stdio.h>
int i=0,top=0;
char s[256];
_Bool judge()
{
  while(s[i]!='@')
  {
   if(s[i]=='(')top++;
   if(s[i]==')')
    if(top>0)top--;
     else return 0;
   i++;
   }
   if(top==0)return 1;
    else return 0;
}
int main()
{
  freopen("stack.in","r",stdin);
  freopen("stack.out","w",stdout);
  gets(s);
  if(judge())printf("YES");
   else printf("NO");
  return 0;
}

算法:

  开一个整型数组作为栈,用变量top模拟括号进出栈的过程,遇到“(”,则指针向后指一位,即top++,遇到“)”,则反之,

但是若在模拟过程中,top<0,则不匹配,若模拟完后top的值不为零,则不匹配。

你可能感兴趣的:(信息学奥赛一本通P350 stack)