Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Небольшая головоломка - абстрактные типы данных
 
 автор: codexomega   (27.04.2006 в 02:32)   письмо автору
 
 

Задача такая:

Есть фраза.
Нам надо написать функцию, которая сможет перевернуть каждое слово, не изменяя порядка слов.

Пример:


Ввод:
Головоломка для продвинутых 

Вывод:
акмоловолоГ ялд хытунивдорп


Используются абстрактные типы данных: Stack & Queue.

Queue: Элементы добавляются в конце, и выводятся вначале (FIFO).
Stack: Элементы добавляются в начале и выводятся в конце(LIFO).

Queue - Вывод элементов:


54321->



Stack - Вывод элементов:


^
|
5
4
3
2
1


Несколько готовых методов:

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


Проблема где-то в циклах.

Помогите пожалуйста разобраться.
Спасибо.

   
 
 автор: Vit   (27.04.2006 в 10:02)   письмо автору
 
   для: codexomega   (27.04.2006 в 02:32)
 

Пользуйся отладкой, во первых, во вторых на кой йух ты используешь Queue и Stack последовательно, достаточно использовать один из них.

   
 
 автор: Loki   (27.04.2006 в 10:13)   письмо автору
 
   для: 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;

   
 
 автор: Trianon   (27.04.2006 в 10:33)   письмо автору
 
   для: codexomega   (27.04.2006 в 02:32)
 

а если так?
<?
  
public static String reversePhrase(String phrase)
  {
        
String reversedPhrase"";
        
myStack = new StackArrayList<String>();

        for(
int i=0i<=phrase.length(); i++)
        {
            if(
== phrase.length() || phrase.charAt(i) == ' ')
            {
                while(
myStack.size())
                    
reversedPhrase += myStack.remove();
                if( 
phrase.length())
                    
reversedPhrase += " ";

            }else
                
myStack.add(String.valueOf(phrase.charAt(i)));
        }
        return  
reversedPhrase;

    } 
// reversePhrase
?>

Собственно, исходная и результирующая строки здесь ведут себя, как очереди.

   
 
 автор: codexomega   (27.04.2006 в 17:10)   письмо автору
 
   для: Trianon   (27.04.2006 в 10:33)
 

Да, так работает.
Спасибо!

   
 
 автор: codexomega   (27.04.2006 в 17:45)   письмо автору
 
   для: codexomega   (27.04.2006 в 17:10)
 

Для тех кто хочет потестировать, креплю все необходимые классы.
Если у вас нет компилятора для Явы, очень советую BlueJ.
Он маленький, бесплатный и очень удобный.
Скачать можно здесь:
http://www.bluej.org/download/download.html

   
 
 автор: codexomega   (27.04.2006 в 19:42)   письмо автору
 
   для: 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: ещё раз спасибо за алгоритм.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования