ブラケットマッチング
'('、 ')'、 '{'、 '}'、 '['、 ']'のみを含む文字列が与えられた場合、その文字列が有効かどうかを判断します
[有効な文字列が満たされている必要があります]
1。左括弧は使用済み同じタイプの閉じ括弧が閉じられます。
2.左括弧は正しい順序で閉じる必要があります。
3.空の文字列は有効な文字列と見なすことができることに注意してください。
【質問分析】:
どのような括弧もペアで表示されることがわかっているので、左括弧が再び表示される場合は、右括弧が一致している必要がありますが、この条件だけが満たされた場合、正常に実行できません。出現回数を同じにするだけでは不十分であり、正しい順序で組み合わせる必要もあります。したがって、スタック構造を使用し、そのfirst-in-last-out機能を使用して左括弧を押し込み、右括弧の価格をスタックの一番上の要素と比較して、スタックからポップします。最後に、スタックが空になると、トラバーサルは同時に終了し、一致を示します。具体的なコードは次のとおりです。
最初にスタックを作成するだけです。
typedef char STDataType;
typedef struct stack
{
STDataType* _data;
int _size;
int _capacity;//栈的容量
}stack;
void initStack(stack* st)//初始化栈
{
if (st == NULL)
return;
st->_data = NULL;
st->_capacity = st->_size = 0;
}
void checkCapacity(stack* st)//容量检查
{
if (st->_capacity == st->_size)
{
int newCap = st->_capacity == 0 ? 1 : 2 * st->_capacity;
st->_data = (STDataType*)realloc(st->_data, sizeof(STDataType)*newCap);
st->_capacity = newCap;
}
}
void stackpush(stack* st, STDataType val)//压栈
{
if (st == NULL)
return;
checkCapacity(st);
st->_data[st->_size++] = val;
}
void stackpop(stack* st)//出栈
{
if (st == NULL || st->_size == 0)
return;
--st->_size;
}
STDataType stackTop(stack* st)//取栈顶元素
{
if (st == NULL || st->_size == 0)
return 0;
return st->_data[(st->_size) - 1];
}
int stackEmpty(stack* st)//判空
{
if (st == NULL || st->_size == 0)
return 1;
else
return 0;
}
これに基づいて、サブルーチンを判断します。
//判断函数
bool isRight(char* s)
{
//括号映射
char map[3][2] = {
{
'(', ')' }, {
'{', '}' }, {
'[', ']' } };
struct stack st;
initStack(&st);
while (*s)
{
int flag = 0;
for (int i = 0; i < 3; ++i)//判断是否为左括号
{
if (*s == map[i][0])
{
stackpush(&st, *s);
//判断下一个字符
++s;
flag = 1;
break;
}
}
if (flag == 0)
{
//取出栈顶元素,先判断栈是否为空
if (stackEmpty(&st))
return false;
char topchar = stackTop(&st);
stackpop(&st);
for (int i = 0; i < 3; ++i)//判断与哪一个匹配
{
if (map[i][1] == *s)
{
if (map[i][0] == topchar)
{
//判断下一个字符
++s;
break;
}
else
return false;//没有正确匹配
}
}
}
}
//判断栈是否为空
return stackEmpty(&st);
}