假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如 ([]())
或 [([][])]
等为正确的匹配,[(])
或 ([]()
或 (()))
均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出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;
}