Рекурсивно изменяющие слова в строке

0

Мой друг получил задание, и я не могу ему помочь. В принципе, используя рекурсию, ему нужно напечатать слова предложения в обратном порядке. Например: Input - это предложение Output - предложение a is This

Вот пример, который я написал ему для обычной печати, и я мог без проблем справиться с целым предложением, но я не могу понять ни одной из исходных точек для реверсирования рекурсивных слов без линейного подхода и использования строковая библиотека или связанные списки или любым другим способом:

#include <iostream>

using namespace std;

void revSentence(char sentence[], int i)
{
  if (sentence[i] == 0)
    return;
  cout<<sentence[i];
  i++;
  revSentence (sentence, i);
}

int main()
{
  char sentence[100];

  cin.getline (sentence, 100);
  int i = 0;

  revSentence(sentence, i);

  return 0;
}

Дело в том, что это, наверное, очень просто, потому что он делает быстрый курс только с основами, поэтому они не использовали ничего, кроме библиотеки iostream, поэтому это должно быть что-то простое или, по крайней мере, не слишком сложное. Поэтому я прошу хотя бы идею подхода или решения. У меня такое чувство, что я пропустил что-то очень простое здесь, но просто не вижу его.

заранее спасибо

  • 1
    Кстати, это не дубликат. Повторяющийся вопрос меняет местами все символы, в то время как этот хочет только тот, который меняет слова.
  • 0
    Это не тот же вопрос. Перевернуть всю строку не будет проблемой вообще.
Теги:
recursion
words
reverse
sentence

2 ответа

3
Лучший ответ
  • Это не так просто, как вы думаете.

  • Вам нужно изменить местоположение, в котором вызывается команда печати, и поместить его ниже рекурсивного вызова revSentence(), это называется revSentence() post-order traversal, тогда как тот, который вы делаете, называется revSentence() pre-order traversal.

  • Вам также нужен стек, чтобы нажимать обратные слова.


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

void revSentence(std::string const &str, std::stack<char> &stk, int i) { 
  if(i == str.size()) return;
  revSentence (str, stk, i + 1);
  if((!stk.empty() && stk.top() != ' '  && str[i] == ' ') || i == 0) {
    if(!i) std::cout << str[i];
    while(!stk.empty()) { 
        std::cout << stk.top();
        stk.pop();
    }
    if(i) std::cout << str[i];
  }
  stk.push(str[i]);
  if(!i) std::cout << std::endl;
}

int main() {
  std::string sentence;
  std::stack<char> stk;
  std::getline (std::cin, sentence);
  int i = 0;
  revSentence(sentence, stk, i);

  return 0;
}
  • 0
    Большое спасибо, это нужно сделать. Даже если мне нужно будет реализовать код в стеке через связанный список, потому что это единственный стек, который они сделали. Но это не должно быть проблемой.
1

Я не могу сказать, разрешено ли вам использовать std :: string и методы... но если это так...

В следующем подходе я подчеркиваю вывод первого и последнего слов во входном предложении, а затем используя рекурсию на левой стороне (здесь называется sMiddle).

Никакой дополнительный стек stl не использовался.

Входная строка дублируется в автоматических переменных, поэтому она использует бит больше стека, чем некоторые другие варианты (не проблема в Linux).

Предполагается, что перед первым словом или после последнего слова.

std::string revSentence(std::string s)
{
   std::string retVal;

   do
   {
      size_t posEndW1 = s.find(' ');
      if(posEndW1 == std::string::npos) break;

      // from line start to end of 1st word
      std::string wFirst = s.substr(0, (posEndW1)); 

      size_t posBeginW2 = s.rfind(' '); // from end of line
      if(posBeginW2 == std::string::npos) break;

      std::string wLast = s.substr(posBeginW2+1, std::string::npos); // to line end

      std::string sMiddle = s.substr(posEndW1+1, (posBeginW2-posEndW1-1));

      retVal = wLast + " " + revSentence(sMiddle) + " " + wFirst;
   }while(0);

   return(retVal);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню