笔试题-通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效
题目
通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:
A. 左括号必须用相同类型的右括号闭合。
B. 左括号必须以正确的顺序闭合。
C. 每个右括号都有一个对应的相同类型的左括号。
题目分析
使用顺序栈实现,遍历输入字符串的每一个元素,遇到左括号'(' 时入栈,遇到右括号 ')'时(栈不为空)出栈,最后判断栈是否为空
代码实现
/**
* @name : JudgeString
* @brief : 使用顺序栈实现输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效
* @param :
* @str:输入的字符串
* @retval : 字符串有效返回true,无效返回false
* @date : 2025/7/5
* @version : 1.0
* @note : None
*/
bool JudgeString(const char *str)
{
//备份字符串
const char *pstr=str;
//创建一个顺序栈
SeqStack_t *manager=SeqStack_Create(100);
DataType_t temp=0;
//遍历字符串
while(*pstr){
//判断当前地址下的字符串是否为'(',如果是则入栈
if(*pstr=='('){
SeqStack_Push(manager,'(');
}
//判断当前地址下的字符串是否为')'
if(*pstr==')'){
//判断当时是否栈为空
if(SeqStack_IsEmpty(manager)){
free(manager->bottom);
free(manager);
return false;
}
SeqStack_Pop(manager,&temp);
}
pstr++;
}
//判断栈是否为空
if(!SeqStack_IsEmpty(manager)){
free(manager->bottom);
free(manager);
return false;
}
free(manager->bottom);
free(manager);
return true;
}
完整代码
/**
* @file name : SeqStack.c
* @brief : 该程序通过堆内存实现顺序栈元素的初始化、入栈、出栈、遍历,另外为了提高可移植性,所以顺序栈中
* 数据元素的类型为DataType_t,用户可以根据实际情况修改顺序表中元素的类型
* @author : MINDSETT@163.com
* @date : 2025/7/5
* @version : 1.0
* @note : None
* CopyRight (c) 2025 MINDSETT@163.com All Right Reserved
*/
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
//指定顺序栈中的元素的数据类型,用户可根据需要进行修改
typedef char DataType_t;
//构造一个实现顺序栈的各项参数(栈底地址+栈容量+栈顶元素的下标)的结构体
typedef struct Sequence_Stack
{
DataType_t * bottom; //栈底地址
unsigned int size; //栈容量
int top; //栈顶元素的下标
}SeqStack_t;
/**
* @name : SeqStack_Create
* @brief : 创建一个顺序栈并进行初始化
* @param : None
* @retval : 返回栈底地址
* @date : 2025/7/5
* @version : 1.0
* @note : None
*/
SeqStack_t *SeqStack_Create(unsigned int size)
{
//1.利用calloc对顺序栈的管理结构体申请一个内存
SeqStack_t *manager=(SeqStack_t *)calloc(1,sizeof(SeqStack_t));
if (NULL == manager){
perror("calloc memory for manager is failed\n");
exit(-1);
}
//2.对顺序栈管理结构体的所有元素进行初始化
manager->bottom=(DataType_t *)calloc(size,sizeof(DataType_t));
if (NULL == manager->bottom){
perror("calloc memory for Stack is failed\n");
exit(-1);
}
manager->size=size;
manager->top=-1;
return manager;
}
/**
* @name : SeqStack_IsFull
* @brief : 判断顺序栈是否已满
* @param :
* @manager:需要判断的顺序栈
* @retval : 已满返回true,未满返回false
* @date : 2025/7/5
* @version : 1.0
* @note : None
*/
bool SeqStack_IsFull(SeqStack_t *manager)
{
return (manager->top+1==manager->size)? true : false;
}
/**
* @name : SeqStack_IsEmpty
* @brief : 判断顺序栈是否为空
* @param :
* @manager:需要判断的顺序栈
* @retval : 为空返回true,不为空返回false
* @date : 2025/7/5
* @version : 1.0
* @note : None
*/
bool SeqStack_IsEmpty(SeqStack_t *manager)
{
return (-1==manager->top)? true : false;
}
/**
* @name : SeqStack_Push
* @brief : 入栈
* @param :
* @manager:需要操作的顺序栈
* @Data:需要压入的元素
* @retval : 已满返回true,未满返回false
* @date : 2025/7/5
* @version : 1.0
* @note : None
*/
bool SeqStack_Push(SeqStack_t *manager,DataType_t Data)
{
//判断顺序栈是否已满
if ( SeqStack_IsFull(manager) ){
printf("Sequence Stack is Full\n");
return false;
}
//如果顺序栈有剩余空间,则把新元素插入顺序栈的栈顶,并更新管理结构体中最后栈顶的元素下标
manager->bottom[++manager->top]=Data;
return true;
}
/**
* @name : SeqStack_Pop
* @brief : 出栈
* @param :
* @manager:需要操作的顺序栈
* @out:接收弹出的值
* @retval : 成功回true,失败返回false
* @date : 2025/7/5
* @version : 1.0
* @note : None
*/
bool SeqStack_Pop(SeqStack_t *manager, DataType_t *out)
{
//判断顺序栈是否为空
if ( SeqStack_IsEmpty(manager) ){
printf("Sequence Stack is empty\n");
return false;
}
//删除一个元素,栈顶元素下标-1
*out=manager->bottom[manager->top--];
return true;
}
/**
* @name : SeqStack_print
* @brief : 遍历顺序栈
* @param :
* @manager:需要操作的顺序栈
* @retval : 成功回true,失败返回false
* @date : 2025/7/5
* @version : 1.0
* @note : None
*/
void SeqStack_print(SeqStack_t *manager)
{
//判断顺序栈是否为空
if ( SeqStack_IsEmpty(manager) ){
printf("Sequence Stack is empty\n");
return;
}
//如果顺序栈不为空,则打印顺序栈的元素
for (int i=0;i<manager->top+1;i++){
printf("Element[%d]=%c\n",i,manager->bottom[i]);
}
printf("\n");
}
/**
* @name : JudgeString
* @brief : 使用顺序栈实现输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效
* @param :
* @str:输入的字符串
* @retval : 字符串有效返回true,无效返回false
* @date : 2025/7/5
* @version : 1.0
* @note : None
*/
bool JudgeString(const char *str)
{
//备份字符串
const char *pstr=str;
//创建一个顺序栈
SeqStack_t *manager=SeqStack_Create(100);
DataType_t temp=0;
//遍历字符串
while(*pstr){
//判断当前地址下的字符串是否为'(',如果是则入栈
if(*pstr=='('){
SeqStack_Push(manager,'(');
}
//判断当前地址下的字符串是否为')'
if(*pstr==')'){
//判断当时是否栈为空
if(SeqStack_IsEmpty(manager)){
free(manager->bottom);
free(manager);
return false;
}
SeqStack_Pop(manager,&temp);
}
pstr++;
}
//判断栈是否为空
if(!SeqStack_IsEmpty(manager)){
free(manager->bottom);
free(manager);
return false;
}
free(manager->bottom);
free(manager);
return true;
}
int main(void)
{
char str[100];
printf("Please input a stings:");
scanf("%s",str);
if(JudgeString(str)){
printf("Strings is valid");
}else{
printf("Strings is invalid");
}
printf("\n");
}