括号匹配问题:
给一个类似这样的字符串:char a[]="(())abc{[(])}";检测三种括号的左右括号是否匹配?
分析:
先取出一个字符,并判断是不是括号(任意括号)?
1. 不是括号,取下一个字符。
2. 是括号。
(1) 是左括号。压栈
(2) 是右括号。和栈顶元素比较
① 栈空。 前面所取的左右括号匹配或者字符串第一个字符为右括号,
说明右括号比左括号多,直接返回。
② 栈不空。栈顶元素与当前括号是否匹配?
匹配, 将栈中的左括号出栈
不匹配,栈顶元素的括号和当前括号的种类不一样
说明左右括号不匹配,直接返回。
当循环结束后,字符串中所有的字符都检测是否匹配。
1. 栈依然为空。左右括号匹配正确。
2. 栈不为空。 左括号比右括号多。
看代码:sum.h
#ifndef __STACK_H__
#define __STACK_H__
typedef int DataType;
typedef struct Node
{
DataType data[10];
int sz;
}Stack;
void Initstack(Stack * stack);
void Pushstack(Stack * stack,DataType d);
void Popstack(Stack * stack);
int Topstack(Stack stack);
void MatchBrackets(Stack *stack, const char* x);
#endif
sum.c
#include"sum.h"
#include<assert.h>
#include<stdio.h>
#include<string.h>
void Initstack(Stack * stack)
{
assert(stack!=NULL);
memset(stack, sizeof(stack->data), 4);
stack->sz = 0;
}
void Pushstack(Stack * stack, DataType d)
{
assert(stack != NULL);
stack->data[stack->sz] = d;
stack->sz++;
}
void Popstack(Stack * stack)
{
assert(stack != NULL);
stack->data[stack->sz - 1] = 0;
stack->sz--;
}
int Topstack(Stack stack)
{
return stack.data[stack.sz - 1];
}
void MatchBrackets(Stack *stack, const char* x)
{
int str = strlen(x);
int i = 0;
for (i = 0; i < str; i++)
{
if ((x[i] == '(') || (x[i] == '[') || (x[i] == '{') || (x[i] == ')') || (x[i] == ']') || (x[i] == '}'))//判断是否是括号
{
if ((x[i] == '(') || (x[i] == '[') || (x[i] == '{'))//判断是否是左括号
{
Pushstack(stack, x[i]);//压栈
}
else
{
if (stack->sz == 0)//判断栈空
{
printf("右括号比左括号多!!!\n");
return;
}
if ((Topstack(*stack) == '(' && x[i] == ')') || (Topstack(*stack) == '[' && x[i] == ']') || (Topstack(*stack) == '{' && x[i] == '}'))//判断栈顶元素与当前括号是否匹配
{
Popstack(stack);//出栈
}
else
{
printf("左右括号次序匹配不正确\n");
return ;
}
}
}
}
if (stack->sz == 0)//判断栈空
{
printf("左右括号匹配正确\n");
}
else
{
printf("左括号比右括号多!!!\n");
}
}
test.c
#include<windows.h>
#include<stdio.h>
#include"sum.h"
int main()
{
Stack stack1;
Stack stack2;
Stack stack3;
Stack stack4;
Initstack(&stack1);
Initstack(&stack2);
Initstack(&stack3);
Initstack(&stack4);
char a[] = "(())abc{[(])}";
char b[] = "(()))abc{[]}";
char c[] = "(()()abc{[]}";
char d[] = "(())abc{[]()}";
MatchBrackets(&stack1, a);
MatchBrackets(&stack2, b);
MatchBrackets(&stack3, c);
MatchBrackets(&stack4, d);
system("pause");
return 0;
}
运行结果: