目录
- 一、题目如下
- 二、解题思路
- 三、代码实现
- 四、测试结果
一、题目如下
通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:
- A. 左括号必须用相同类型的右括号闭合。
- B. 左括号必须以正确的顺序闭合。
- C. 每个右括号都有一个对应的相同类型的左括号。
二、解题思路
设计一个栈容器,循环遍历字符串:
- 如果遇到‘(’的话则压入栈
- 如果遇到')'的话,将栈中的‘(’出栈,如果在遇到’)‘时,栈已经清空,说明没有对应的'(',不符合条件
- 如果字符串遍历完成,栈容器不为空的话,说明有'('没有对应的')'
三、代码实现
/************************************************************************************* 设计一个算法,这个算法可以识别某个字符串的左括号是否和对应的右括号闭合,如果全都闭合的话符合条件* A.左括号必须用相同类型的右括号闭合。* B.左括号必须以正确的顺序闭合。* C.每个右括号都有一个对应的相同类型的左括号。* Copyright (c) 2024-2025 370591244@qq.com All right Reserved
************************************************************************************/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>typedef struct StrStack
{char *data;int size;int top;
}Stack_t;Stack_t *initStack(int size)
{//为数据源申请一块合适的内存char *str = (char *)calloc(size,sizeof(char));if(!str){perror("Stack data memory apply failed!");exit(-1);}//为栈结构管理器申请一块栈内存Stack_t* manager = (Stack_t*)calloc(1,sizeof(Stack_t));if(!manager){perror("Stack manager memory apply failed!");exit(-1);}manager->data = str;manager->size = size;manager->top = -1;
}// 销毁栈空间
void destoryStack(Stack_t *stack)
{free(stack->data);free(stack);
}//压栈
void push(Stack_t *stack, char c)
{if(stack->top == stack->size - 1){printf("栈空间已满!");return;}stack->data[++stack->top] = c;
}//出栈
bool pop(Stack_t *stack)
{if(stack->top == -1){// printf("栈空间已空,出栈失败!\n");return false;}stack->top--;return true;
}void CheckString(char *str,int size)
{// 初始化栈空间Stack_t *stack = initStack(size);for(int i=0; i<strlen(str); i++){if(str[i] == '('){push(stack,str[i]);} else if(str[i] == ')'){if(!pop(stack)){printf("不符合条件,存在右括号没有对应的左括号\n");return;}}}// 如果循环完毕,栈空间为空的话,说明全部闭合;if(stack->top == -1) {printf("符合条件\n");} else{printf("不符合条件,存在未闭合的左括号\n");}destoryStack(stack);
}int main(void)
{char str[50];printf("请输入一个字符串:\n");scanf("%s", str);CheckString(str,50);
}
四、测试结果
dada@dada-virtual-machine:~/test$ ./brakets
请输入一个字符串:
(qet))
不符合条件,存在右括号没有对应的左括号
dada@dada-virtual-machine:~/test$ ./brakets
请输入一个字符串:
(djgk)
符合条件
dada@dada-virtual-machine:~/test$ ./brakets
请输入一个字符串:
(iwejt)adf
符合条件
dada@dada-virtual-machine:~/test$ ./brakets
请输入一个字符串:
(dur(lkf)
不符合条件,存在未闭合的左括号