题目:对于一个可能包括括号{}、[]、 ()的表达式,判定其中括号是否匹配
我们运用到了栈的重要思想:LIFO(后进先出),最后一个进栈的元素要第一个出来,这跟符号匹配的思想也是相同的,最后一个进来的前括号要先匹配好再出去
比如字符串: { [ ] }, 其中[ 后进入,要先出来,{先进入,要后出来。
提供的代码中isBalance中,依次读取字符串的每个字符,利用定义的current指针指向当前元素。
我们把前括号:(、 [ 、{ 压入栈中,如果读取到后括号)、]、},就定义一个topChar指针指向栈顶元素,检测当前current和topChar两个指针相匹配,就调用Pop函数弹出栈顶元素。
当全部元素均弹出时,我们调用isEmpty函数进行检测,如果栈为空,说明全部符号均匹配完成,返回true。
# include <stdio.h>
#include <stdbool.h>
#include <string.h>
# define MAX_SIZE 100
//定义栈结构
typedef struct {
int data[MAX_SIZE];
int top;
}CharStack;
//初始化栈
void InitStack(CharStack *stack) {
stack->top = -1;
}
//检查栈是否为空
bool isEmpty(CharStack *stack) {
return stack->top == -1; //如果top指向-1就满足
}
//检查栈是否为满
bool isFull(CharStack *stack) {
return stack->top == MAX_SIZE - 1;
}
//入栈操作
bool Push(CharStack *stack, char c) {
if(isFull(stack)) {
return false; //如果栈满,就返回false
}
stack->top++; //top指针向上移动
stack->data[stack->top] = c; //将c赋给该元素
return true;
}
//出栈操作
bool Pop(CharStack *stack) {
if(isEmpty(stack)) {
return false; //如果栈空,无法出栈
}
stack->top--; //top指针向下移动
return true;
}
//判断括号是否匹配
//前符号满足栈的特性:后进先出
//重要思想:依次读取字符串中每一个字符,如果是前括号就Push入栈
//如果是后括号,就定义栈顶指针与其进行比较,匹配成功则将前括号出栈
//如果到最后比较完全部字符串都出栈,即满足isEmpty,就返回true
bool isBalanced(char *expression) {
CharStack stack;
InitStack(&stack);
int length = strlen(expression); //存储表达式的长度
for(int i = 0; i < length; i++) {
char current = expression[i]; //把第i个字符串存储到current中
//如果第i个字符是 ( [ { 任意一个,就将其Push到栈中
if(current == '(' || current == '[' || current == '{') {
Push(&stack, expression[i]);
}
else if(current == ')' || current == ']' || current == '}') {
if(isEmpty(&stack)) {
return false; //如果此时栈为空,则没有符号与其进行匹配,返回false
}
//定义一个栈顶指针存储栈顶元素数据
char topChar = stack.data[stack.top];
//检测是否三种符号都匹配
if((current == ')' && topChar == '(') ||
(current == ']' && topChar == '[') ||
(current == '}' && topChar == '{')) {
//如果匹配成功,就将栈顶元素Pop出栈
Pop(&stack);
}
else {
return false; //如果匹配不成功,则返回false
}
}
}
return isEmpty(&stack);//最后如果栈为空说明匹配成功
}
int main() {
char expression[] = "{[()]()}"; //定义一个字符串数值,expression就为其首元素地址
if(isBalanced(expression)) {
printf("字符中括号全部匹配成功!");
}
else {
printf("字符中括号匹配失败!");
}
return 0;
}