给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
// aa.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
bool isValid(char* s) {
char *str=s;
char a[100];
int i=0;
while(*str!='\0')
{
if(*str=='(')
{
a[i]='(';
i++;
}else if(*str=='[')
{
a[i]='[';
i++;
} else if(*str=='{')
{
a[i]='{';
i++;
}
else if(*str==')')
{
if(i<=0) return false;
i--;
if( a[i]=='(')
{
a[i]=' ';
}
else{
return false;
}
}
else if(*str==']')
{
if(i<=0) return false;
i--;
if(a[i]=='[')
{
a[i]=' ';
}
else{
return false;
}
}
else if(*str=='}')
{
if(i<=0) return false;
i--;
if(a[i]=='{')
{
a[i]=' ';
}
else{
return false;
}
}
str++;
}
if( a[0]==' ')
return true;
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
bool f= isValid("()");
if(f)
printf("%s","匹配");
else
printf("%s","不匹配");
system("pause");
return 0;
}
也可以利用栈(Stack),先进后出的特点,利用while循环扫描字符串。如果字符是’(’,‘[’,’{'就进栈,如果扫描到与之匹配的字符就出栈。扫描完毕之后,判断字符串是否为空,空则返回true,否则返回false。
typedef struct LNode
{
int data;
struct LNode * next;
} LNode,*LinkStack;