C++ 栈实现回文判断优化:错误条件修正
C++ 栈实现回文判断优化:错误条件修正
在判断栈的回文字符序列的函数 IsPalindrome 中,使用了错误的条件来判断是否匹配成功。在判断括号是否匹配时,应该先判断栈是否为空,再判断栈顶元素和当前字符是否匹配。
原代码:
int IsPalindrome(SqStack &S,char *t)
{
/**************begin************/
int count=0;
char *p=t;
while(*p!=0)
{
count++;
p++;
}
for(int i=0;i<count;i++)
{
if(t[i]=='('||t[i]=='{'||t[i]=='[')
{
Push(S,t[i]);
}
}
for(int i=0;i<count;i++)
{
if(t[i]==')'&&*(S.top--)=='(') // 错误的条件判断
{
Pop(S);
}
else if(t[i]=='}'&&*(S.top--)=='{') // 错误的条件判断
{
Pop(S);
}
else if(t[i]==']'&&*(S.top--)=='[') // 错误的条件判断
{
Pop(S);
}
}
if(S.base==S.top)
return OK;
else
return ERROR;
/**************end************/
}
优化后的代码:
int IsPalindrome(SqStack &S, char *t)
{
int count = 0;
char *p = t;
while (*p != 0)
{
count++;
p++;
}
for (int i = 0; i < count; i++)
{
if (t[i] == '(' || t[i] == '{' || t[i] == '[')
{
Push(S, t[i]);
}
else if (t[i] == ')' && *(S.top - 1) == '(')
{
Pop(S);
}
else if (t[i] == '}' && *(S.top - 1) == '{')
{
Pop(S);
}
else if (t[i] == ']' && *(S.top - 1) == '[')
{
Pop(S);
}
}
if (S.base == S.top)
return OK;
else
return ERROR;
}
主函数的优化:
int main()
{
char t[100];
while (cin >> t && t[0] != '0')
{
SqStack S;
InitStack(S);
if (IsPalindrome(S, t) == OK)
cout << "匹配成功" << endl;
else
cout << "匹配失败" << endl;
}
return 0;
}
修改说明:
- 在
IsPalindrome函数中,将*(S.top--)改为*(S.top - 1),并添加了判断栈是否为空的逻辑:if (S.top == S.base) return ERROR;。 - 在主函数中,将判断栈是否为空的部分改为判断栈顶元素是否为空指针:
if (S.base == S.top).
总结:
通过以上修改,我们修复了代码中的错误,使 IsPalindrome 函数能够正确判断回文字符序列。
代码说明:
代码使用了基于数组的顺序栈结构,主要包含以下操作:
InitStack(SqStack &S): 初始化栈,分配栈空间并设置栈顶指针。Push(SqStack &S, char e): 将元素入栈,检查栈是否满,并将元素存入栈顶。Pop(SqStack &S): 将栈顶元素出栈,检查栈是否为空,并将栈顶指针下移。IsPalindrome(SqStack &S, char *t): 判断字符序列t是否为回文,通过比较栈顶元素和当前字符来判断是否匹配。
代码示例:
输入:([]{})
输出:匹配成功
输入:({[]})
输出:匹配成功
输入:([)]
输出:匹配失败
原文地址: https://www.cveoy.top/t/topic/phMa 著作权归作者所有。请勿转载和采集!