括号皮匹配问题,核心思想就利用栈的原理后进先出(Last-In-First-Out,LIFO),也是利用栈的经典问题
bool isValid(char* s) {
int i = 0;
int num = 0;
for (int n; s[n] != '\0'; ++n) //先遍历一遍,给栈分配足够的空间
{
if (s[n] == '(' || s[n] == '{' || s[n] == '[') {
num++;
}
}
if (num == 0) {
return false;
}
else
{
char stack[num]; //利用数组栈的思想
int top = -1; //伪指针
for (i; s[i] != '\0'; ++i) //将传入的括号字符数组进行遍历
{
char c = s[i];
if (c == '(' || c == '{' || c == '[') //如遇见左括号入栈/压栈
{
++top;
stack[top] = c;
} else
{
if (c == ')' || c == '}' || c == ']')
{
if (top == -1)//第一个括号是右括号,直接返回false
{
return false;
} else
{
if ((c == ')' && stack[top] == '(') ||
(c == '}' && stack[top] == '{') ||
(c == ']' && stack[top] == '[')) //开始匹配右括号
{
--top;//匹配成功,弹出一个
} else
{
return false;
}
}
}
}
}
if (top == -1) //防止栈里还有左括号未匹配完
{
return true;
} else
{
return false;
}
}
}
代码虽然,通俗,但是还是觉得有些繁琐,条件判断太多,适合新手小白参考,感谢有大佬来指正!!!
下面仅供参考
// 定义栈
typedef struct Stack
{
char data[1000];
int top;
}Stack;
// 栈初始化
void InitStack(Stack *stack)
{
stack->top = -1;
}
// 入栈操作
void Push(Stack *stack, char ch)
{
// 栈顶指针的移动
stack->top++;
// 元素入栈
stack->data[stack->top] = ch;
}
// 出栈
bool Pop(Stack *stack, char *ch)
{
// 空栈判断
if (stack->top == -1)
{
return false;
}
else
{
// 读取元素
*ch = stack->data[stack->top];
// 栈顶指针移动
stack->top--;
return true;
}
}
// 括号匹配函数
bool Compare(char ch1, char ch2)
{
return (ch1 == ch2);
}
bool isValid(char* s)
{
// 栈初始化
Stack stack;
InitStack(&stack);
// 默认情况是匹配上了
bool result = true;
char *ptr = s;
char ch = 0;
while (*ptr != '\0')
{
switch (*ptr)
{
case '(':
case '[':
case '{':
Push(&stack, *ptr);
break;
case ')':
case ']':
case '}':
// 出栈比较
if (!Pop(&stack, &ch))
{
result = false;
break;
}
else
{
// 字符串当前字符和栈顶元素比较
if (!Compare(ch, *ptr))
{
result = false;
break;
}
else
{
coutinue;
}
}
break;
default:
break;
}
}
return result;
}