栈:
栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除等操作。
没有任何元素的栈称为空栈。
栈又称为 后进先出 的线性表。
括号匹配问题:
算法思路:
一个关于括号匹配的例子:
封装一个静态栈:
#define Max 20
#define DataType char
typedef struct Stack
{
DataType data[Max];
int top;
}stack;
测试函数:
void TestMatchBrackets()
{
stack s;
StackInit(&s);
char a[] = "(())abc{[(])}";
char b[] = "(()))abc{[]}";
char c[] = "(()()abc{[]}";
char d[] = "(())abc{[]()}";
MatchBrackets(&s, a);
MatchBrackets(&s, b);
MatchBrackets(&s, c);
MatchBrackets(&s, d);
}
括号匹配代码:
void MatchBrackets(stack *s,char arr[])
{
int i = 0;
int len = strlen(arr);
char top;
//初始化栈
StackInit(s);
for (i = 0; i < len; i++)
{
//判断是否是括号
if (IsMatch(arr[i]))
{
//判断括号为左括号还是右括号
if (arr[i] == ')' || arr[i] == '}' || arr[i] == ']')
{
//栈为空,右括号多于左括号
if (EmptyStack(s))
{
printf("右括号多于左括号!\n");
return;
}
//不为空,取栈顶元素,判断是否匹配
else
{
top = TopStack(s);
if (!((arr[i] == ')'&&top == '(') || (arr[i] == ']'&&top == '[') || (arr[i] == '}'&&top == '{')))
{
printf("左右括号次序不匹配\n");
return;
}
else
PopStack(s);
}
}
else
{
//左括号
PushStack(s, arr[i]);
}
}
}
if (EmptyStack(s))
{
printf("左右括号正确匹配!\n");
return;
}
else
{
printf("左括号多于右括号!\n");
return;
}
}
栈初始化:
void StackInit(stack *s)
{
assert(s);
s->top = 0;
memset(s->data,0, 20 * sizeof(DataType));
}
判断是否是括号:
int IsMatch(char ch)
{
if (ch == '(' || ch == ')' || ch == '{' || ch == '}' || ch == '[' || ch == ']')
return 1;
else
return 0;
}
判断栈空:
top为0成立,即为占空。
int EmptyStack(stack *s)
{
assert(s);
//如果等式成立,返回1
return s->top == 0;
}
运行展示: