思想:
- 1、先对Manager的Top(栈中有效数据的下标)备份,用循环对字符串进行遍历
a.当前字符不为'('和‘)’则进行下一次循环
b.当前字符为'('则将'('入栈,并将Manager中的Top(下标)加1
c.当前字符为')'则判断当前Top是否与备份的数值相等,如不相等,则')'前面没有'('与之配对,既字符串无效,直接返回;如不相等,则对栈进行出栈,TOP(下标)减一 - 2、结束循环后,对Top(下标)和备份的数据进行对比
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)
{
// 对栈的顶部做备份
int temp = Manager->Top;
// 用循环对字符串做遍历,将'('入栈
for (int i = 0;; i++)
{
// 循环退出条件为当前字符等于字符串尾部的'\0'
if ('\0' == *(str + i))
break;
// 如果当前字符不为'('和')'则进行下一次循环
if ('(' != *(str + i) && ')' != *(str + i))
continue;
// 当前字符为'('的情况
else if ('(' == *(str + i))
{
SeqStack_Push(Manager, *(str + i));
}
// 当前字符为')'的情况
else
{
// 如果栈的底部与初始相等,则当前字符的')'的前面没有'('与之匹配,字符串无效
if (temp == Manager->Top)
{
printf("字符串无效\n");
return false;
}
// 字符')'前面有'('的情况,则将前面的'('出栈
else
{
SeqStack_Pop(Manager);
}
}
}
标签:字符,顺序,当前,Top,笔试,Manager,str,字符串
From: https://www.cnblogs.com/Dazz24/p/18158006