|
|
|
| Задача такая:
Есть фраза.
Нам надо написать функцию, которая сможет перевернуть каждое слово, не изменяя порядка слов.
Пример:
Ввод:
Головоломка для продвинутых
Вывод:
акмоловолоГ ялд хытунивдорп
|
Используются абстрактные типы данных: Stack & Queue.
Queue: Элементы добавляются в конце, и выводятся вначале (FIFO).
Stack: Элементы добавляются в начале и выводятся в конце(LIFO).
Queue - Вывод элементов:
Stack - Вывод элементов:
Несколько готовых методов:
Queue:
// добавить элемент в конец
add()
// убрать элемент из начала
remove()
// возвращает первый элемент, не удаляя его
first()
// кол-во элементов
size()
|
Stack:
// добавить элемент сверху
add()
// убрать элемент из конца(сверху)
remove()
// возвращает первый элемент(сверху), не удаляя его
first()
// кол-во элементов
size()
|
Вот, вкратце.
Хотя код и на яве, он вполне классический, и понятен будет для каждого.
Нужен алгоритм, который перевернет эту проклятую фразу.
Моя идея такая:
Разбить фразу при чтении на части(слова) разделенные пробелом.
Потом вставлять эти самые слова, по одному, по букве, в Stack.
Затем выводить по одной букве из каждого слова из Stack, и вставлять eё(букву) в Queue.
В самом конце, перевернутая фраза выводится из Queue и помещается в строковую переменную.
Я пытаюсь сделать так, но не получается.
public static String reversePhrase(String phrase){
int position = 0;
int subStringLength = 0;
String subString = "";
String reversedPhrase= "";
// creation of stack
myStack = new StackArrayList<String>();
// creation of queue
myQueue = new QueueArrayList<String>();
//
for(int i=0; i<phrase.length(); i++){
if(phrase.charAt(i) == ' '){
subString = phrase.substring(position,i);
subStringLength = subString.length();
position += i;
}
if(subString.length() > 0){
for(int j=0; j<subStringLength; j++){
myStack.add(String.valueOf(subString.charAt(j)));
}
}
for(int m=0; m<myStack.size(); m++){
myQueue.add(myStack.remove());
}
subString="";
}
for(int k=0; k<myQueue.size(); k++){
reversedPhrase += myQueue.remove();
}
return reversedPhrase;
} // reversePhrase
|
Проблема где-то в циклах.
Помогите пожалуйста разобраться.
Спасибо. | |
|
|
|
|
|
|
|
для: codexomega
(27.04.2006 в 02:32)
| | Пользуйся отладкой, во первых, во вторых на кой йух ты используешь Queue и Stack последовательно, достаточно использовать один из них. | |
|
|
|
|
|
|
|
для: codexomega
(27.04.2006 в 02:32)
| | А функции работы со строками допускаются?:)
Тогда:
<?
$text="Головоломка для продвинутых";
$tmp=explode(" ", $text);
foreach ($tmp as $key=>$val)
$tmp[$key]=strrev($val);
$text_new=implode(" ", $tmp);
echo $text."<br>";
echo $text_new;
|
| |
|
|
|
|
|
|
|
для: codexomega
(27.04.2006 в 02:32)
| | а если так?
<?
public static String reversePhrase(String phrase)
{
String reversedPhrase= "";
myStack = new StackArrayList<String>();
for(int i=0; i<=phrase.length(); i++)
{
if(i == phrase.length() || phrase.charAt(i) == ' ')
{
while(myStack.size())
reversedPhrase += myStack.remove();
if( i < phrase.length())
reversedPhrase += " ";
}else
myStack.add(String.valueOf(phrase.charAt(i)));
}
return reversedPhrase;
} // reversePhrase
?>
|
Собственно, исходная и результирующая строки здесь ведут себя, как очереди. | |
|
|
|
|
|
|
|
для: Trianon
(27.04.2006 в 10:33)
| | Да, так работает.
Спасибо! | |
|
|
|
|
|
|
|
для: codexomega
(27.04.2006 в 17:10)
| | Для тех кто хочет потестировать, креплю все необходимые классы.
Если у вас нет компилятора для Явы, очень советую BlueJ.
Он маленький, бесплатный и очень удобный.
Скачать можно здесь:
http://www.bluej.org/download/download.html | |
|
|
|
|
|
|
|
для: codexomega
(27.04.2006 в 17:45)
| | Вот решение с применением Stack и Queue:
public static String reversePhrase(String phrase){
String reversedPhrase= "";
myStack = new StackArrayList<String>();
myQueue = new QueueArrayList<String>();
for(int i=0; i<=phrase.length(); i++)
{
if(i == phrase.length() || phrase.charAt(i) == ' ')
{
while(!myStack.isEmpty())
myQueue.add(myStack.remove());
if( i < phrase.length())
myQueue.add(" ");
}else
myStack.add(String.valueOf(phrase.charAt(i)));
}
while(!myQueue.isEmpty())
reversedPhrase +=myQueue.remove();
return reversedPhrase;
} // reversePhrase
|
Trianon: ещё раз спасибо за алгоритм. | |
|
|
|