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

本文介绍了一个ACM编程挑战题目,要求检查代码中的括号是否正确匹配,使用队列数据结构进行实现。文章提供了详细的解题思路和完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
欢迎大家加入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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我菜就爱学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值