не может понять, почему работает стек, но не очередь, чтобы проверить, является ли данное слово палиндромом - PullRequest
0 голосов
/ 02 ноября 2011

Я использую стек и очередь, чтобы проверить, является ли данное слово палиндромом. Я могу вставить новый символ в стек, но я не могу поместить более одного символа в очередь. Я не вижу, где моя ошибка в коде. Любая помощь будет оценена. Ниже приведен код на C ++ с использованием Dev-C ++. Спасибо за ваше время!

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

using namespace std;

void push_char()
{

  string givenword; int sizeword, countchar;
  string letter;
  stack<string> stackword; string stawo1;
  queue<string>  queueword; string quewo1;

  cout<<"enter the word to test "<<endl;
  getline(cin,givenword);
  string str (givenword);
  sizeword=str.size();
  cout<<" the word given   "<<givenword<<"   size of word= "<<sizeword  <<endl;
  countchar=0;
  bool pali=true;

  while ((countchar<sizeword))
  {          
    stackword.push(str.substr(countchar,1));
    queueword.push(str.substr(countchar,1));
    cout<<" stack letter= "<<stackword.top()<<" queue letter= "<<queueword.front()<<endl;
    countchar++;

    if(stackword.top()==queueword.front())
      cout<<"same letter found !"<<endl;
    else
      pali=false;

    if (pali==false)
      cout<<"not a palindrome"<<endl;
    else
      cout<<"palindrome!"<<endl;
  }
}

int main()
{
  push_char();
}

Ответы [ 3 ]

0 голосов
/ 02 ноября 2011

К вашему сведению, вы можете использовать str [countchar] вместо str.substr (countchar,

несколько пунктов:

1) Ваш код в порядке, ваш алгоритм - нет.Возьмите лист бумаги и пошагово проделайте то, что вы делаете.

2) Я вижу, что вы пытаетесь сделать ... что-то вроде следующего непроверенного кода, верно?

for(int i=0; i<sizeword; ++i) {
  stackword.push(str[i]);
  queueword.push(str[i]);
}

pali = true;
for(int i=0; i<sizeword; ++i) {
  if(stackword.top() != queueword.front()) {
    pali = false;
    break;
  }
  stackword.pop();
  queueword.pop();
}
0 голосов
/ 03 ноября 2011

у вас есть два варианта здесь. Номер один - это то, что предлагает aleph_null - двойной проход, где вы добавляете символы в контейнеры на первом проходе и сравниваете их на втором проходе. Второй вариант - сравнивать их так, как вы это делаете, но смотрите на противоположные стороны слова. На самом деле для этого вам не нужны контейнеры, но с минимальными изменениями ваш цикл while должен выглядеть так:

while ((countchar<sizeword))
{          
  stackword.push(str.substr(countchar,1));
  queueword.push(str.substr(sizeword - 1 - countchar,1)); // adding from the back
  cout<<" stack letter= "<<stackword.top();
  cout<<" queue letter= "<<queueword.back()<<endl; // .back() not .front()
  countchar++;

  if(stackword.top()==queueword.back()) // again, looking at the last added char
    cout<<"same letter found !"<<endl;
  else
    pali=false;

  // as Joe McGrath pointed out this should probably be outside the loop...
  if (pali==false)
    cout<<"not a palindrome"<<endl;
  else
    cout<<"palindrome!"<<endl;
}

Надеюсь, это поможет.

Roman

0 голосов
/ 02 ноября 2011

Есть лучшие способы найти палиндром ... но это не тот вопрос, который вы задали.

В этой строке: if (stackword.top () == queueword.front ())

Где ваша ошибка.Когда вы толкаете в очередь, вы нажимаете в конце.Фронт не изменится.Так что вам кажется, что в этом есть только одна вещь.

Когда вы кладете в стек, он толкает поверх существующего стека.

...