括号序列由()[]{}组成,例如((([][{}])))这样的序列是合法的,而)(就是不合法的,要求用程序实现:
判断一个括号序列是否合法
判断一个括号序列是否合法
boolean isValidSeq(String input)
网上查了下,居然有更巧妙的方法,咳,高手果然太多了....
#include <iostream>
#include <string>
using namespace std;
#define LeftLit -1
#define RightLit 1
#define LeftMid -2
#define RightMid 2
#define LeftLar -3
#define RightLar 3
bool removeNum(int *stackNum, int &size)
{
if(size == 0)
return true;
//用于储存size
bool sizeFlag = false;
for(int i = 0; i < size - 1; i++)
{
//判断是否出现相邻的括号匹配
if((stackNum[i] + stackNum[i + 1])==0)
{
//判断是否是左括号在左边的情况
if(stackNum[i] < stackNum[i + 1])
{
for(int j = i; j < size - 1; j++)
{
//把后面的数字移动回来
stackNum[j] = stackNum[j + 2];
}
i--;
size = size - 2;
sizeFlag = true;
}else
//如果是右括号在左边
{
return false;
}
}
}
if(!sizeFlag)
return false;
//如果发觉大小未发生变化
return removeNum(stackNum, size);
}
bool isValidSeq(string input)
{
int stackNum[input.size()];
int NumSize = 0;
//将中间出现的括号都通过数字体现在数组中
int j = 0;
for(int i = 0; i < input.size(); i++)
{
switch(input[i])
{
case '(':
stackNum[j] = LeftLit;
j++;
break;
case ')':
stackNum[j] = RightLit;
j++;
break;
case '[':
stackNum[j] = LeftMid;
j++;
break;
case ']':
stackNum[j] = RightMid;
j++;
break;
case '{':
stackNum[j] = LeftLar;
j++;
break;
case '}':
stackNum[j] = RightLar;
j++;
break;
}
}
NumSize = j;
//括号数不为偶数,则代表不可能一一匹配
if(NumSize % 2 != 0)
return false;
return removeNum(stackNum, NumSize);
}
int main(int argc, char *argv[])
{
string s("{[}]");
bool flag = isValidSeq(s);
if(flag)
{
cout<< "is valid" << endl;
}else
{
cout<< "not valid" << endl;
}
}