堆栈和队列回文程序

Stack and Queue Palindrome Program

我正在编写一个程序来确定用户输入的字符串是否为回文。程序可以编译,但是当打印输出时,所有字符串都被确定为回文,即使它们不是。教科书翻了好几遍,代码review调试了几十遍,看了其他类似的回文题,还是一头雾水

我的代码如下:

 #include <iostream>
    #include <stack>
    #include <queue>
    #include <string>
    using namespace std;

    int main (void)
    {
      stack <char> s;
      queue <char> q;
      string letter;
      int length;

      cout<<"Please enter a series of characters."<<endl;
      getline (cin, letter);
      length = letter.size();

      for (int i=0; i<length; i++)
        {
          q.push(i);
          s.push(i);
        }

         bool isPalindrome = true;
         while (isPalindrome==true && (!s.empty() && !q.empty()))
         {
           if (s.top() != q.front())
            {
              isPalindrome = false;
            }
          else
           {
            q.pop();
            s.pop();
           }
         }

       if(isPalindrome==false && (s.empty() && q.empty()))
         {
          cout<<"True or false: "<<isPalindrome<<endl;
          cout<<"Is not a palindrome."<<endl;
         }
       else
         {
           cout<<"Is a palindrome."<<endl;
         }

    }

如果有人能解释为什么会这样,我将不胜感激。谢谢!

这个条件

   if(isPalindrome==false && (s.empty() && q.empty()))

永远不会等于 true。:)

因为你在循环中将 isPalindrome 设置为 false 而没有从堆栈和队列中弹出相应的元素

       if (s.top() != q.front())
        {
          isPalindrome = false;
        }

因此程序控制总是传递给else语句

   else
     {
       cout<<"Is a palindrome."<<endl;
     }

而不是if语句中的错误条件

   if(isPalindrome==false && (s.empty() && q.empty()))

你可以这样写

   if (isPalindrome == false )

或者干脆

   if ( !isPalindrome )

或者您可以完全删除变量 isPalindrome 并使用条件

   if ( s.empty() && q.empty() )

或更简单

   if ( s.empty() )

程序可以这样看

#include <iostream>
#include <stack>
#include <queue>
#include <string>

int main() 
{
    while ( true )
    {
        std::string letters;
        std::cout << "Please enter a string (Enter - exit): ";
        std::getline( std::cin, letters );

        if ( letters.empty() ) break;

        std::stack<char> 
            s( std::stack<char>::container_type( letters.begin(), letters.end() ) );
        std::queue<char> 
            q( std::queue<char>::container_type( letters.begin(), letters.end() ) );

        while ( !s.empty() && s.top() == q.front() )
        {
            s.pop();
            q.pop();
        }

        if ( s.empty() ) std::cout << "The string is a palindrome" << std::endl;
        else std::cout << "The string is not a palindrome" << std::endl;
    }

    return 0;
}

在最后的 if 语句中,您不必要地检查 stack/queue 是否为空,因为如果上面的 isPalindrome 为假,它们很可能不会为空。

另外,看起来你想把

cout<<"True or false: "<<isPalindrome<<endl;

if 语句之前,以便它始终运行。

好吧,对于初学者来说,你推整数而不是字符。要推送字符串中的字符,请使用 q.push(letters[i]) 而不是 q.push(i).

你也可以去掉栈,把一半的字符串压入队列,然后和另一半比较。像这样:

#include <iostream>
#include <queue>
#include <string>

using namespace std;

int main (void)
{
  queue <char> q;
  string letter;
  int length;

  cout<<"Please enter a series of characters."<<endl;
  getline (cin, letter);

  bool isPalindrome = false;

  if (letters.size() > 0)
  {
    int length = letter.size() / 2;

    for (int i=0; i<length; i++)
    {
      q.push(letters[i]);
    }

    isPalindrome = true;

    for (int i = 1; i <= length && isPalindrome; ++i)
    {
      isPalindrome = q.front() == letters[letters.size() - i];
      q.pop();
    }
  }

  if(!isPalindrome)
  {
    cout<<"Is not a palindrome."<<endl;
  }
  else
  {
    cout<<"Is a palindrome."<<endl;
  }

  return 0;
}

或者您实际上可以避免为这样一个简单的任务使用繁重的数据结构,而使用一个简单的循环来执行此操作:

bool isPalindrome = false;
int len = letters.size();

if (len > 0)
{
  isPalindrome = true;

  for (int i = 0; i < len / 2 && isPalindrome; ++i)
  {
    isPalindrome = letters[i] == letters[len - i - 1];
  }
}
#include<iostream>
#include <stack>
#include<queue>
#include<string>
using namespace std;
int main() {
queue<char> q;
stack <char> s;
string name;
int count = 0;
cout << "Please enter a name " << endl;
cin >> name;
for (int i = 0; i < name.size(); i++) {
    q.push(name[i]);
    s.push(name[i]);
}
bool check = true;
if (!q.empty() && !s.empty() && check){
    if (s.top() == q.front()) {
        q.pop();
        s.pop();
        cout << " It is a palindrome " << endl;
    }
    else
        cout << " It's not a palindrome" << endl;

    }

system("pause");
return 0;


}