算法第一期day3

第一期day3

题目链接

7.23:P1739 表达式括号匹配

题目大意

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

输入

一行:表达式

输出

一行:“YES” 或“NO”

思路

一开始觉得括号匹配,那么只要左括号数右括号数相等就行,然后发现部分正确,想了一下应该是这种情况 )(,那么也是不匹配的情况,然后就使用一个flag变量来判断,当有左括号时就+1,当有右括号就-1,那么如果是匹配的,最终肯定为0,问题就在于如何判断右括号早于左括号出现,前面说到有左括号便会+1,那么只要 flag不为0,则右括号就是正常出现的,则-1,若 flag为0,说明此时右括号的出现早于左括号,那么就不对 flag做任何改变,这样最终就成不了0;

AC代码

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
	string str;
	cin >> str;
	int left = 0, right = 0;
	int flag = 0;
	for (int i = 0; i < 10000; i++)
	{
		if (str[i] == '(')
		{
			left++;
			flag++;
		}
		else if (str[i] == ')')
		{
			right++;
			if(flag!=0)
				flag--;
		}
		else if (str[i] == '@')
			break;
	}
	if (left == right && flag == 0)
		cout << "YES" << endl;
	else
		cout << "NO" << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值