利用栈,实现括号匹配功能

发布于:2025-06-24 ⋅ 阅读:(11) ⋅ 点赞:(0)

利用栈,实现括号匹配功能,例:"()"匹配成功,"([]"匹配失败

main.c

#include "stack.h"


int main() {
    char testCases[][MAX_LENGTH] = {
        "()", "(]", "([)]", "{[]}", "((())", ""
    };
    int numCases = sizeof(testCases) / sizeof(testCases[0]);
    
    for (int i = 0; i < numCases; i++) {
        printf("表达式 '%s': %s\n", 
               testCases[i], 
               isBalanced(testCases[i]) ? "匹配成功" : "匹配失败");
    }
    
    return 0;
}    

stack.h

#ifndef __STACK_H__
#define __STACK_H__

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#define MAX_LENGTH 100

typedef struct {
    char data[MAX_LENGTH];
    int top;
} Stack;

void initStack(Stack *s);
bool isEmpty(Stack *s);
bool push(Stack *s, char c);
bool push(Stack *s, char c);
bool peek(Stack *s, char *c);
bool isLeftBracket(char c);
bool isRightBracket(char c);
bool isMatchingPair(char left, char right) ;
bool isBalanced(char *expression);


#endif

stack.c

#include "stack.h"



// 初始化栈
void initStack(Stack *s) {
    s->top = -1;
}

// 判断栈是否为空
bool isEmpty(Stack *s) {
    return s->top == -1;
}

// 入栈操作
bool push(Stack *s, char c) {
    if (s->top >= MAX_LENGTH - 1) {
        return false; // 栈溢出
    }
    s->data[++(s->top)] = c;
    return true;
}

// 出栈操作
bool pop(Stack *s, char *c) {
    if (isEmpty(s)) {
        return false; // 栈为空
    }
    *c = s->data[(s->top)--];
    return true;
}

// 获取栈顶元素
bool peek(Stack *s, char *c) {
    if (isEmpty(s)) {
        return false; // 栈为空
    }
    *c = s->data[s->top];
    return true;
}

// 判断字符是否为左括号
bool isLeftBracket(char c) {
    return c == '(' || c == '[' || c == '{';
}

// 判断字符是否为右括号
bool isRightBracket(char c) {
    return c == ')' || c == ']' || c == '}';
}

// 判断左右括号是否匹配
bool isMatchingPair(char left, char right) {
    switch (left) {
        case '(': return right == ')';
        case '[': return right == ']';
        case '{': return right == '}';
        default: return false;
    }
}

// 检查表达式括号是否匹配
bool isBalanced(char *expression) {
    Stack s;
    initStack(&s);
    int len = strlen(expression);
    
    for (int i = 0; i < len; i++) {
        char c = expression[i];
        if (isLeftBracket(c)) {
            if (!push(&s, c)) {
                printf("错误:栈溢出\n");
                return false;
            }
        } else if (isRightBracket(c)) {
            char topChar;
            if (!pop(&s, &topChar)) {
                return false; // 没有匹配的左括号
            }
            if (!isMatchingPair(topChar, c)) {
                return false; // 括号类型不匹配
            }
        }
    }
    
    return isEmpty(&s); // 栈为空表示所有括号都匹配
}

makefile

EXE=stack
Objs=$(patsubst %.c,%.o,$(wildcard *.c))
CC=gcc
CFlags=-c -o

all:$(EXE)
$(EXE):$(Objs)
    $(CC) $^ -o $@
%.o:%.c
    $(CC) $^ $(CFlags) $@
.PHONY:clean                                   
clean:
    rm $(EXE) $(Objs)



网站公告

今日签到

点亮在社区的每一天
去签到