PTA 7-1 字符串匹配问题(strs)

假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如 ([]()) 或 [([][])] 等为正确的匹配,[(]) 或 ([]() 或 (())) 均为错误的匹配。

现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?

输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出OK ,不匹配就输出 Wrong

输入格式:

输入仅一行字符(字符个数小于 255)。

输出格式:

匹配就输出 OK ,不匹配就输出 Wrong

输入样例1:

在这里给出一组输入。例如:

[(])

输出样例1:

在这里给出相应的输出。例如:

Wrong

输入样例2:

[([][])]

输出样例2:

OK

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

⭐问题!!!

我尝试把括号栈非空(含有数个左括号)的错误情况的判断写到 bool sign_check()函数中,但是结果出错,千方百计想了想把这种情况的判断放到main函数最后判断输出的位置就正确了。

究竟为什么啊,有没有大佬可以为我解释一下呀!!!

代码

#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
#define MAX 256
stack<char>  signs;
char arr[MAX];

bool sign_check(char* a, int  n)//判断函数
{
	bool flag = 1;	//定义一个标志变量,初始化值为1
	for (int i = 0; i < n; i++)
	{
		if (signs.empty())  //栈空,无条件入栈
			signs.push(a[i]);
		else if (a[i] == '('|| a[i] == '[')//栈非空⭐,输入是左括号直接入栈。
			signs.push(a[i]);
		else if (a[i] == ')' && signs.top() == '(')//栈非空,输入左圆括号正确前提为栈顶为右圆括号
			signs.pop();//能配对就栈顶元素出栈,以便下一步判断
		else if (a[i == ']'] && signs.top() == '[')//栈非空,输入左方括号正确前提为栈顶为右方括号
			signs.pop();//能配对就栈顶元素出栈,以便下一步判断
		else {//包括栈为空,输入右括号;注意,这里不包括栈非空,栈内有左括号的情况!!!
			flag = 0;
			break;
		}
	}
	return flag;
}


int main()
{
	fgets(arr, 256, stdin);//我用的是vs编译器,gets函数因不安全而禁止使用,所以用fgets函数读取输入流
	int l = strlen(arr);  //cstring 头文件中包含的strlen函数可以计算字符数组的长度
	if (sign_check(arr, l))
		cout << "OK" << endl;
	else if (!signs.empty())//栈非空,栈内有左括号的情况在这里讨论了!!!(不过为什么写到bool函数里就错啦啊啊啊啊啊啊啊啊)
		cout << "WRONG" << endl;
	else
		cout << "WRONG" << endl;

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值