设置一个算法来检查括号是否成对。通过利用stack数据结构检查。如( xy(x)输出错误,( xy(x))输出正确。填补缺少的三个函数:empty、push和pop。实现这三个函数,它们标记为TODO并包含一些提示。注释说明了函数的作用,参数及其应返回的内容。
main里面是算法逻辑,c是运行,h里面是函数
抄个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函数用于从栈中弹出一个元素。在算法中,我们通过依次读取输入的字符来检查括号是否成对。当遇到左括号时,我们将其压入栈中;当遇到右括号时,我们尝试从栈中弹出一个左括号。