bool isValid(char* s ) {
// write code here
int i=0;
int len=strlen(s);
if(len%2==1)
return false;
for(i=0;i<len-1;i++)
{
if(s[i]==')'||s[i]==']'||s[i]=='}')
return false;
switch(s[i])
{
case '(':
if(s[i+1]==')')
i++;
else
return false;
case '[':
if(s[i+1]==']')
i++;
else
return false;
case '{':
if(s[i+1]=='}')
i++;
else
return false;
default:return false;
}
}
return true;
}
题目为:
以上代码有以下问题:
1 对于含有右括号的字符串,直接返回false,这是错误的,因为有可能在后面的部分中有与之匹配的左括号。
2 在switch语句中,每个case后面都应该有break语句,否则会出现执行下一个case的情况。例如,输入为"[]{}()"时,代码会返回false,因为当遇到左括号时,执行匹配成功后的语句后,会继续执行下一个case,而不是直接跳出switch语句。
3 在switch语句中,默认情况下应该返回false,因为如果不是左括号或右括号,那么它一定不符合括号序列的规则。
4 输入为空串时,应该返回true。
可以考虑用栈来解决问题,遇到左括号就入栈,遇到右括号就与栈顶元素匹配,如果匹配成功就把栈顶元素出栈。如果遍历完成后栈为空,则说明括号序列合法。希望能帮到你
bool isValid(char* s) {
int len = strlen(s);
if (len % 2 == 1) {
return false;
}
char stack[len];
int top = 0;
for (int i = 0; i < len; i++) {
switch (s[i]) {
case '(':
case '[':
case '{':
stack[top++] = s[i];
break;
case ')':
if (top == 0 || stack[--top] != '(') {
return false;
}
break;
case ']':
if (top == 0 || stack[--top] != '[') {
return false;
}
break;
case '}':
if (top == 0 || stack[--top] != '{') {
return false;
}
break;
default:
return false;
}
}
return top == 0;
}
int days(struct date day) {
//这里首先定义一个关于闰年和非闰年每一个月天数的二维数组
const int month_days[2][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, //非闰年每一个月的天数
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; //闰年每一个月的天数
int i, lp=0;
if(day.year%4 == 0 && day.year %100!=0 || day.year%400 == 0) lp=1; //lp用来判断是否闰年
...
}
我可以给您一些改进建议: 1.您的算法只能判断括号的数量是否匹配,但不能判断括号的顺序是否匹配。例如,"(([]))"和"([)]"都有相同数量的括号,但是后者的括号顺序不匹配,应该判定为不匹配。因此,您需要使用栈来保存左括号,在扫描到右括号时,弹出栈顶元素比较是否匹配。 2.使用gets函数可以导致缓冲区溢出和安全问题,应该使用fgets函数。 3.对于输入字符串的长度,最好使用strlen函数获取其长度而不是遍历整个字符串。 下面是一个实现字符串括号匹配的C程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 1000
typedef struct stack { // 定义一个栈结构体
char data[MAXLEN]; // 最多存储MAXLEN个字符
int top; // 栈顶指针
} Stack;
void initStack(Stack *s) { // 初始化栈
s->top = -1;
}
void push(Stack *s, char c) { // 将元素入栈
s->top++;
s->data[s->top] = c;
}
char pop(Stack *s) { // 将栈顶元素弹出
char temp = s->data[s->top];
s->top--;
return temp;
}
int isEmpty(Stack *s) { // 判断栈是否为空
return s->top == -1;
}
int isMatch(char c1, char c2) { // 判断两个括号是否匹配
return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}');
}
int isValid(char *s) {
int len = strlen(s); // 计算字符串长度
if (len % 2) // 如果字符串长度为奇数,直接返回不匹配
return 0;
Stack s1;
initStack(&s1); // 初始化栈
for (int i = 0; i < len; i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') // 如果是左括号,入栈
push(&s1, s[i]);
else if (s[i] == ')' || s[i] == ']' || s[i] == '}') { // 如果是右括号
if (isEmpty(&s1) || !isMatch(pop(&s1), s[i])) // 如果栈为空或者栈顶元素与当前元素不匹配
return 0; // 返回不匹配
}
}
if (!isEmpty(&s1)) // 如果栈不为空
return 0; // 返回不匹配
return 1; // 括号匹配成功
}
int main() {
char s[MAXLEN];
printf("输入一个字符串:");
fgets(s, MAXLEN, stdin); // 输入字符串,使用fgets函数
s[strcspn(s, "\n")] = '\0'; // 去除fgets函数输入的换行符
if (isValid(s))
printf("括号匹配成功!\n");
else
printf("括号匹配失败!\n");
return 0;
}