设置一个算法来检查括号,字符串的平衡和嵌套都很好

设置一个算法来检查括号是否成对。通过利用stack数据结构检查。如( xy(x)输出错误,( xy(x))输出正确。填补缺少的三个函数:empty、push和pop。实现这三个函数,它们标记为TODO并包含一些提示。注释说明了函数的作用,参数及其应返回的内容。

main里面是算法逻辑,c是运行,h里面是函数

img

img


img

img

img

img

img

抄个leetcode的答案给你参考,你自己把非括号的字符忽略掉或替换掉就Ok


class Solution {
public:
    bool isValid(string s) {
        if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求
        stack<char> st;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(') st.push(')');
            else if (s[i] == '{') st.push('}');
            else if (s[i] == '[') st.push(']');
            // 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
            // 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
            else if (st.empty() || st.top() != s[i]) return false;
            else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
        }
        // 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
        return st.empty();
    }
};

该回答引用ChatGPT

以下是对应的代码实现:


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

#define MAX_SIZE 100

// 栈结构体
typedef struct {
    char data[MAX_SIZE];
    int top;
} Stack;

// 判断栈是否为空
int empty(Stack *s) {
    // TODO: 根据栈顶指针判断栈是否为空,如果为空返回1,否则返回0
    return (s->top == -1) ? 1 : 0;
}

// 向栈中添加元素
void push(Stack *s, char c) {
    // TODO: 判断栈是否已满,如果已满则输出错误信息并退出,否则将元素添加到栈顶
    if (s->top == MAX_SIZE - 1) {
        printf("Error: Stack is full\n");
        return;
    }
    s->top++;
    s->data[s->top] = c;
}

// 弹出栈顶元素
char pop(Stack *s) {
    // TODO: 判断栈是否为空,如果为空则输出错误信息并退出,否则弹出栈顶元素并返回
    if (empty(s)) {
        printf("Error: Stack is empty\n");
        return '\0';
    }
    char c = s->data[s->top];
    s->top--;
    return c;
}

int main() {
    Stack s;
    s.top = -1;
    char str[MAX_SIZE];
    printf("请输入要检查的字符串:");
    scanf("%s", str);
    int len = strlen(str);
    for (int i = 0; i < len; i++) {
        char c = str[i];
        if (c == '(') {
            push(&s, c);
        } else if (c == ')') {
            if (empty(&s)) {
                printf("Error: Extra closing parenthesis\n");
                return 0;
            } else {
                pop(&s);
            }
        }
    }
    if (empty(&s)) {
        printf("Parentheses match\n");
    } else {
        printf("Error: Extra opening parenthesis\n");
    }
    return 0;
}

该算法的主要逻辑是遍历输入的字符串,如果遇到左括号,则将其压入栈中;如果遇到右括号,则从栈中弹出一个左括号进行匹配。如果在弹出左括号时栈已经为空,则说明输入的右括号多余,匹配失败。最终,如果栈为空,则说明括号匹配成功;否则说明输入的左括号多余,匹配失败。

参考GPT和自己的思路,下面是一个使用栈数据结构检查括号是否成对的算法,并包含实现空栈(empty),压入栈(push),从栈中弹出(pop)三个函数的示例代码。

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

// TODO: 实现栈结构
typedef struct {
    int top; // 栈顶元素的索引
    char items[100]; // 栈中存储的元素
} Stack;

// TODO: 检查栈是否为空
bool empty(Stack* stack) {
    // 栈为空的条件是栈顶元素的索引为-1
    return stack->top == -1;
}

// TODO: 向栈中压入一个元素
void push(Stack* stack, char c) {
    // 将元素放入栈顶,并将栈顶元素索引加1
    stack->top++;
    stack->items[stack->top] = c;
}

// TODO: 从栈中弹出一个元素
char pop(Stack* stack) {
    // 如果栈为空,则返回0(假设栈中不存储0)
    if (empty(stack)) {
        return 0;
    }
    // 获取栈顶元素并将栈顶元素索引减1
    char c = stack->items[stack->top];
    stack->top--;
    return c;
}

int main() {
    // 初始化栈
    Stack stack;
    stack.top = -1;
    // 读取输入
    char c;
    while ((c = getchar()) != EOF) {
        if (c == '(') {
            // 如果是左括号,则将其压入栈中
            push(&stack, c);
        } else if (c == ')') {
            // 如果是右括号,则尝试从栈中弹出一个左括号
            char top = pop(&stack);
            if (top != '(') {
                // 如果弹出的不是左括号,则表示括号不匹配
                printf("错误:右括号多余\n");
                return 1;
            }
        }
    }
    if (!empty(&stack)) {
        // 如果栈中还有未匹配的左括号,则表示括号不匹配
        printf("错误:左括号多余\n");
        return 1;
    }
    // 没有错误则表示括号匹配
    printf("正确:括号匹配\n");
    return 0;
}

上面的代码中,我们定义了一个Stack结构体来表示栈,并使用三个函数empty、push和pop来操作栈。empty函数用于检查栈是否为空,push函数用于将一个元素压入栈中,pop函数用于从栈中弹出一个元素。在算法中,我们通过依次读取输入的字符来检查括号是否成对。当遇到左括号时,我们将其压入栈中;当遇到右括号时,我们尝试从栈中弹出一个左括号。