括号匹配检验:
假设表达式中允许包括两种括号:圆括号与方括号,其嵌套顺序随意,即()或者[([][])]都是正确的。而这[(]或者(()])或者([())都是不正确的格式。检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。例如,考虑一下括号的判断:[([][])]
已知条件解析
- 只有两种括号 ()和[]这两种
- 同一种括号要成对出现
- “期待的急迫程度”的意思就是要有优先级关系,后出现的左括号"("和"[",要优先于先出现的左括号
解决方式
- 用栈先进后出的方式来解决
- 如果是左括号类型"("和"["就入栈
- 如果是右括号类型")"和"]",判断是否和栈顶元素类型匹配,如果不匹配直接返回
代码
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char ElemType;
typedef struct linkList{
ElemType data;
struct linkList *next;
}LinkList, *LinklistPtr;
typedef struct BracketsStack{
LinklistPtr top;
int count;
}BracketsStack;
Status initBracketsStack(BracketsStack *bStack) {
bStack->top = NULL;
bStack->count = 0;
return OK;
}
Status isStackEmpty(BracketsStack bStack) {
if (bStack.count == 0) {
return TRUE;
} else {
return FALSE;
}
}
Status getBracketsStackTopElem(BracketsStack bStatck, ElemType *elem) {
if (isStackEmpty(bStatck)) {
return ERROR;
} else {
*elem = bStatck.top->data;
return OK;
}
}
Status pushData2BracketsStack(BracketsStack *bStack, ElemType elem) {
LinklistPtr temp = (LinklistPtr)malloc(sizeof(LinkList));
temp->data = elem;
temp->next = bStack->top;
bStack->top = temp;
bStack->count ++;
return OK;
}
Status popDataFromBracketsStack(BracketsStack *bStack, ElemType *elem) {
LinklistPtr temp = bStack->top;
*elem = temp->data;
bStack->top = temp->next;
free(temp);
bStack->count--;
return OK;
}
Status checkBrackets(char *brackets){
BracketsStack bs;
initBracketsStack(&bs);
char *p = brackets;
while (*p) {
if (*p == '(' || *p == '[') {
printf("push %c\n", *p);
pushData2BracketsStack(&bs, *p);
} else {
ElemType topElem;
Status iStatus = getBracketsStackTopElem(bs, &topElem);
if (iStatus) {
ElemType elem;
if (*p == ')' && topElem == '(') {
popDataFromBracketsStack(&bs, &elem);
printf("pop %c-%c\n", *p, elem);
} else if (*p == ']' && topElem == '[') {
popDataFromBracketsStack(&bs, &elem);
printf("pop %c-%c\n", *p, elem);
} else {
return ERROR;
}
} else {
return ERROR;
}
}
p++;
}
if (isStackEmpty(bs)) {
return OK;
} else {
return ERROR;
}
}
int main(int argc, const char * argv[]) {
printf("Hello, World!\n");
if (checkBrackets("[([][])]")) {
printf("括号匹配\n");
} else {
printf("括号不匹配\n");
};
if (checkBrackets("[(]")) {
printf("括号匹配\n");
} else {
printf("括号不匹配\n");
};
return 0;
}
运行
传送门
算法题-每日气温