笔试题-通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效

题目

通过键盘输入一个包括 '(' 和 ')' 的字符串string ,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:

A. 左括号必须用相同类型的右括号闭合。

B. 左括号必须以正确的顺序闭合。

C. 每个右括号都有一个对应的相同类型的左括号。

题目分析

使用顺序栈实现,遍历输入字符串的每一个元素,遇到左括号'(' 时入栈,遇到右括号 ')'时(栈不为空)出栈,最后判断栈是否为空

image-20250709182629646

代码实现

/**
 * @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");

}

代码测试

image

posted @ 2025-07-10 14:38  verd  阅读(12)  评论(0)    收藏  举报