【题目描述】
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,如([ ]())或[([ ][ ])]等为正确的匹配,[( ])或([ ]( )或 ( ( ) ) )均为错误的匹配。
现在的问题是,要求检验一个给定表达式中的括弧是否正确匹配?
输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出 “OK” ,不匹配就输出“Wrong”。输入一个字符串:[([][])],输出:OK。
【输入】
输入仅一行字符(字符个数小于255)。
【输出】
匹配就输出 “OK” ,不匹配就输出“Wrong”。
【输入样例】
[(])
【输出样例】
Wrong
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
char a[256],b[256];//一个输入的数组,一个栈
int main()
{
gets(a);
int t=0;
for(int i=0;i<strlen(a);i++)
{
if(a[i]=='(')//如果输入的是左括号,那么栈里面存一个并且+1。这里有一个非常细节的地方!那就是++t而不是t++。因为到最后栈清空,指针应该是0。如果0上面有东西,那肯定是不行的,所以从1开始存。
b[++t]='(';
if(a[i]=='[')
b[++t]='[';
if(a[i]==')')//如果是右括号,那么就找指针指的地方可不可以匹配
{
if(b[t]=='(')
t--;//如果可以匹配,那么指针--,准备判断下一个
else
t++;//如果不行,那么就相当于导入右括号,因为右括号是不能跟后面的匹配的,所以空的也无所谓
}
if(a[i]==']')//同理
{
if(b[t]=='[')
t--;
else
t++;
}
}
if(t==0)//如果清空,那么可以;反之不行
{
cout<<"OK";
return 0;
}
else
{
cout<<"Wrong";
return 0;
}
return 0;
}
思路很重要啊,应用了栈。一开始我的思路其实是分开来做,但是我没有想到存数组指针--的方法。怎么说呢,虽然这节是栈,但其实我在做第一个括号匹配的时候,也就是只有一种括号的时候,我没有用栈,只是用了一个变量,有左括号就+1,右括号就-1,只需判断过程中有没有下溢并且结果是不是0就行。但是多种括号就行不通了,因为涉及到一个括号夹着括号的问题。所以指针--的方法是很巧妙的(其实就是栈)。理解不了思路可以这样想:如果可以,总有一组是“面对面的”,也就是一组对应括号中没有别的括号,那么这一组“抵消”掉之后再往前找,然后可以的话再抵消。比如:( [ ( ) ] ),当循环到第四个,也就是第一个右括号的时候,可以和左括号组成一组,然后指针--,就变成了( [ ] ),然后再抵消,最后就可以判断了