如何比较字符串以查看在'$'之前输入的字符是否等于之后的字符?

时间:2012-02-20 05:17:14

标签: c++ string algorithm stack

我一直在为一本书实现一个算法,如下所示:

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;

}

3 个答案:

答案 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;