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

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

下面是我的代码:
/******************************************************
*
* 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;
}
}

浙公网安备 33010602011771号