Balancing Symbols
目录
一、符号匹配问题:
检查匹配是一个很常见的问题,比如规定下面三组匹配方式。
'('
与 ')'
、'['
与 ']'
、'{'
与 '}'。如果符号没有按照对应方式嵌套匹配,则认为匹配非法。
那么我们如何处理一串类似于“[(({}))]”这样子的字符串,判断其匹配是否合法呢?
二、栈模型的应用
符号匹配问题是栈的一个比较典型的应用。
1、判断两个字符是否对应匹配
int IsMatch(char c1, char c2) {
switch(c1){
case '(':
return c2 == ')';
case '[':
return c2 == ']';
case '{':
return c2 == '}';
}
}
2、处理串
判断传入字符串s是否合法匹配:
我们称左括号这一类为左元素,不用匹配直接入栈。
右括号这一类为右元素,需要先看是否有对应左元素匹配,在进行入栈、出栈操作。
int Judge(char s[]) {
int len = strlen(s);
STACK stack = CreatStack(len);
for(int i = 0; i < len; i++) {
if(s[i] == '(' || s[i] == '[' || s[i] == '{' || IsEmpty(stack))
push(s[i], stack); //为左元素或栈空,入栈
else if(IsMatch(top(stack), s[i]))
pop(stack); //与栈顶匹配则栈顶元素出栈
else
push(s[i], stack); //与栈顶不匹配则入栈
}
if(IsEmpty(stack))
return 1; //栈为空,说明完全匹配
return 0; //栈不空则说明有无法匹配之处
}
完整代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct Stack {
int capacity; //栈的容积
int top; //栈顶位置
int *array; //数组,存放数据
} *STACK, stack;
STACK CreatStack(int num) {
STACK s = (STACK) malloc(sizeof(stack));
s->array = malloc(num * sizeof(int)); //动态申请数组
s->capacity = num;
s->top = -1; //栈顶位置为-1,即空
return s;
}
int IsEmpty(STACK s) {
return s->top == -1;
}
void push(int x, STACK s) {
if (s->top < s->capacity) //栈未满
s->array[++s->top] = x;
}
int top(STACK s) {
if (!IsEmpty(s))
return s->array[s->top];
Error("Empty Stack");
return ERROR;
}
void pop(STACK s) {
if (!IsEmpty(s))
s->top--;
}
int IsMatch(char c1, char c2) {
switch(c1){
case '(':
return c2 == ')';
case '[':
return c2 == ']';
case '{':
return c2 == '}';
}
}
int Judge(char s[]) {
int len = strlen(s);
STACK stack = CreatStack(len);
for(int i = 0; i < len; i++) {
if(s[i] == '(' || s[i] == '[' || s[i] == '{' || !IsEmpty(stack))
push(s[i], stack); //为左元素或栈空,入栈
else if(IsMatch(top(stack), s[i]))
pop(stack); //与栈顶匹配则栈顶元素出栈
else
push(s[i], stack); //与栈顶不匹配则入栈
}
if(IsEmpty(stack))
return 1; //栈为空,说明完全匹配
return 0; //栈不空则说明有无法匹配之处
}
int main() {
char s[100];
gets(s);
if(Judge(s))
printf("It is legal.\n");
else
printf("It is illegal.\n");
return 0;
}
end
欢迎关注个人公众号“鸡翅编程”,这里是认真且乖巧的码农一枚,旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~