我一直在为一本书实现一个算法,如下所示:
L = {w $ w':w是一个可能为空的字符串而不是$ w'= reverse(w)}
按照书籍伪代码,我为我的程序编写了代码,例如你输入的字符串(A $ A,ABC $ CBA),并比较$之前和之后的字符,以确定它们是否为回文。我完全按照本书的指示编写了代码,但程序运行不正常。无论我输入什么,它总是返回false。
我不知道我做错了什么。
这是我写的代码:
#include <iostream>
#include "stack.h"
#include <string>
using namespace std;
bool isInLanguage(string aString)
{
Stack<char> aStack;
int i = 0;
// ch is aString[i]
while( aString[i] != '$')
{
aStack.push(aString[i]);
++i;
}
//skip the $
++i;
//match the reverse of w
bool inLanguage = true; // assume string is in language
while(inLanguage && i < aString.length())
{
char stackTop;
aStack.pop(stackTop);
if(stackTop == aString[i])
++i; //characters match
else
//top of stack is not aString[i]
inLanguage = false; //reject string
if(aStack.isEmpty())
{
//pop failed, stack is empty. first half of string
//is shorter than second half)
inLanguage = false;
} // end if
} // end while
if (inLanguage && aStack.isEmpty())
return true;
else
return false;
} // end isInLanguage
int main()
{
string str;
bool boolean;
cout << "Enter a string to be checked by the algorithm : ";
cin >> str;
boolean = isInLanguage(str);
if (boolean == true)
cout << "The string is in language.\n";
else
cout << "The string is not in language.\n";
return 0;
}
答案 0 :(得分:2)
即使在弹出字符串中的最后一个字符后,您也会检查if(aStack.IsEmpty())
,这将返回true,然后将inLanguage
设置为false
。因此,即使字符串是回文照片,您仍然会在弹出最后一个字符后将inLanguage
设置为false
。
答案 1 :(得分:1)
你没有在弹出操作的while循环之前重新初始化变量i = 0。
....
++i;
//match the reverse of w
bool inLanguage = true; // assume string is in language
while(inLanguage && i < aString.length())
{
.....
根据您的代码,while循环中的条件i < aString.length
将始终为false。
在while循环之前尝试这个..
i = 0;
答案 2 :(得分:1)
你在while
循环中的逻辑是错误的,就像Naveen所说的那样。考虑一下$ a的简单案例会发生什么:
push 'a' in the stack
skip $
pop 'a' and compare with 'a' -> inLanguage == true
stack is empty -> inLanguage == false
这显然不是你想要的。您需要在循环条件下测试堆栈大小。我将循环简化为这样的东西:
while (i < aString.size() && !aStack.isEmpty()) {
char stackTop;
aStack.pop(stackTop);
if(stackTop != aString[i]) break;
++i;
}
if (i == aString.size() && aStack.isEmpty())
return true;
else
return false;