HRBUST - 1170(判断括号是否匹配)

简介: HRBUST - 1170(判断括号是否匹配)

题目:

欢迎大家加入ACM!

要深入的学习ACM的相关知识,首先就必须学会一门编程语言,推荐C/C++。

不过对于初学者,因为没编过多少代码,经常出现变异错误,其实就是语法错误。

现在要你检查一段代码的语法是否否正确。

为了简化问题,我们只检查 (、)、{、} 括号是否匹配了,并且在输入的代码中不包含字符的’(’,’)’,’{’,’}’。

其他语法错误不检查,如 “#include <stdio.h”,“2 = x”,是错误的,但是不检查。

Input

有多组测试数据,每组测试数据有一段代码,该段代码可能在有多行。
每段代码以Ctrl+Z结束。
处理到文件结束。

Output

每组测试数据输出一行。
如果这段代码括号匹配了,输出 Right ,否则输出 Wrong。

Sample Input

#include <stdio.h
int main(){
    int a b;
    while (scanf("%d%d", &a, &b) != EOF) {
        printf("%d\n", a + b);
    }
}
Ctrl+Z
int main(){
    int a, b;
    while (scanf("%d%d", &a, &b) != EOF) {
        printf("%d\n", a + b);
   
}
Ctrl+Z

Sample Output

Right
Wrong

题意描述:给一段代码判断这段代码会不会出现 “(” “)”“{” “}”括号的语法错误;

解题思路:把每段代码用二维数组存入,如果输入“Ctrl+Z”表示输入结束,用queue栈去分别存入“()"和”{}“,最后判断代码是否正确。代码如下:

程序代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
char a[10000][10000];//二维数组去存储代码
int main()
{
  while(scanf("%s",a[0])!=EOF)//题意表示至少也要输入一行代码
  {
    int i=1;
    while(scanf("%s",a[i])!=EOF)
    {
      if(strcmp(a[i],"Ctrl+Z")==0)   //用字符串函数判断是否输入结束
        break;
      i++;
    }
    queue<char> s[2];//用栈分别去存储两种括号
    int flag=1;
    int k,j;
    for(k=0;k<i;k++)
    {
      for(j=0;a[k][j]!='\0';j++)
      {
        if(a[k][j]=='(')
        {
          s[0].push(a[k][j]);//进栈
          continue;
        }
        if(a[k][j]=='{')
        {
          s[1].push(a[k][j]);//进栈
          continue;
        }
        if(a[k][j]==')'&&s[0].empty()==0)
        {
          s[0].pop();//出栈
          continue;
        }
        if(a[k][j]==')'&&s[0].empty()==1)//如果输入当前括号且栈为空表示输入代码一定错误
        {
          flag=0;
          break;
        }
        if(a[k][j]=='}'&&s[1].empty()==0)
        {
          s[1].pop();
          continue;
        }
        if(a[k][j]=='}'&&s[1].empty()==1)
        {
          flag=0;
          break;
        }
      }
      if(flag==0)
        break;
    }
    if(flag)
    {
      if(s[0].empty()==1&&s[1].empty()==1)
        cout<<"Right"<<endl;
      else
        cout<<"Wrong"<<endl;
    }
    else
      cout<<"Wrong"<<endl;
  }
  return 0;
}
相关文章
|
6月前
|
JavaScript 前端开发 Java
|
24天前
判断字符
【10月更文挑战第18天】判断字符。
28 5
|
27天前
判断字母
【10月更文挑战第15天】判断该字符是否为一个字母。
27 3
|
2月前
判断第二个字母
判断第二个字母。
27 4
|
2月前
|
存储 算法 索引
给定一个只由左括号和右括号的字符串,返回最长的有效括号子串的长度。如何解答呢?
给定一个只由左括号和右括号的字符串,返回最长的有效括号子串的长度。如何解答呢?
|
6月前
|
算法 测试技术 C#
【字符串】【括号匹配】【广度优先】301. 删除无效的括号
【字符串】【括号匹配】【广度优先】301. 删除无效的括号
【字符串】【括号匹配】【广度优先】301. 删除无效的括号
|
存储 Java 网络安全
用正则表达式匹配3的任意倍数
正则表达式能匹配3的任意倍数?(注意是任意倍数) ,我曾经也很震惊,但确实可以。我5年多前练习正则表达式,在Regex Golf这个正则表达式测试网站上发现了这个题,当时完全没有任何头绪,于是我在知乎提问正则表达式如何匹配 3 的倍数 ,但是得到了好多知乎大佬的关注,也上了当天的热榜。 排名第一的答主已经给出了答案和思路,但这么多年来我一直都没看懂,最近学习编译原理,看到正则表达式和DFA,于是仔细研究了一下这个问题,并将问题扩展至匹配N的倍数,最后给出通用解法和代码。
43 0
|
算法 前端开发 JavaScript
【前端算法】判断一个字符串的括号是否成对匹配
使用typescript完成判断一个字符串的括号是否成对匹配的过程
131 0
用户输入括号是否匹配
用户输入括号是否匹配
73 0
用户输入括号是否匹配