用顺序栈判断输入的字符串的左右括号是否有效 (笔试题)

image

思想:

  • 1、先对Manager的Top(栈中有效数据的下标)备份,用循环对字符串进行遍历
    a.当前字符不为'('和‘)’则不处理
    b.当前字符为'('则将'('入栈,并将Manager中的Top(下标)加1
    c.当前字符为')'则判断当前栈是否为空,如为空,则')'前面没有'('与之配对,既字符串无效,直接返回;如不为空,则对栈进行出栈,TOP(下标)减一
  • 2、结束循环后,看栈是否为空
    a.如为空,则所有的'('都有')'与之配对,即字符串有效
    b.如不为空,则有多余 的'(没有')'与之配对,即字符串无效

image

下面是我的代码:

/******************************************************
 *
 *  name      : IsStrValid
 *
 * function : 通过键盘输入一个包括  '(' 和 ')' 的字符串string ,判断字符
 *             串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串
 *             需满足以下条件:
 *               A.	左括号必须用相同类型的右括号闭合。
 *               B.	左括号必须以正确的顺序闭合。
 *               C.	每个右括号都有一个对应的相同类型的左括号。
 *  argument
 *              @Manager : 顺序栈的地址
 *              @str     :需要判断是否有效的字符串
 *
 *  retval    : 有效返回1,否则返回0
 *  author    : Dazz
 *  date      : 2024/4/25
 *  note      : None
 *
 * *******************************************************/
bool IsStrValid(SeqStack_t *Manager, char *str)
{
    // 用循环对字符串做遍历,将'('入栈
    for (int i = 0;; i++)
    {
        // 循环退出条件为当前字符等于字符串尾部的'\0'
        if ('\0' == *(str + i))
            break;

        // 当前字符为'('的情况
        if ('(' == *(str + i))
        {
            SeqStack_Push(Manager, *(str + i));
        }
        // 当前字符为')'的情况
        if (')' == *(str + i))
        {
            // 如果栈为空,则当前字符的')'的前面没有'('与之匹配,字符串无效
            if (SeqStack_IsEmpty(Manager))
            {
                printf("字符串无效\n");
                return false;
            }
            // 字符')'前面有'('的情况,则将前面的'('出栈
            else
            {
                SeqStack_Pop(Manager);
            }
        }
    }

    // 循环退出后有两种情况

    // 栈不为空,即存在左括号无法与右括号匹配
    if (!SeqStack_IsEmpty(Manager))
    {
        printf("字符串无效\n");
        // 需要把剩余的左括号出栈
        while (!SeqStack_IsEmpty(Manager))
        {
            SeqStack_Pop(Manager);
        }

        return false;
    }
    // 栈为空的情况,即所有的左括号都能与右括号匹配
    else
    {
        printf("字符串有效\n");

        return true;
    }
}


posted @ 2024-04-25 16:36  Dazz_24  阅读(20)  评论(0)    收藏  举报