Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Очередь и дек С++

35K
10 марта 2011 года
life4fun
64 / / 15.11.2010
Ребят, помогите пожалуйста сделать небольшую программу, ну просто горит(((. :(
Разработать программу на С++, для реализации основных операций над полу-статичными структурами данных (добавление, удаление) и над их информационными частями-строками (поиск, извлечение, добавление символов и т.д.), на примере очереди и дека, строки - векторы фиксированной длины.
Спасибо огромное!
278
10 марта 2011 года
Alexander92
1.1K / / 04.08.2008
life4fun, у тебя уже 49 сообщений на форуме, и 99% из них в стиле "Сделайте за меня чего-нибудь, ну пожалуйста". Может, пора сменить стиль?
Выкладывай наработки, задавай конкретные вопросы - будем обсуждать по сути.
32K
10 марта 2011 года
Rififi
54 / / 04.06.2008
Alexander92

Может, пора сменить стиль?

стиль здесь ни при чём. чел просто барыжит потихоньку задания от своих одногруппников.. :D
11K
11 марта 2011 года
xAtom
65 / / 17.01.2011
Ты говоришь очередь и дек это одно и тоже, может имеешь виду списка list<typename>, vector<typename> - зачем он удобен для статичных а не динамичных данных. При удаление из вектора динамо(new, malloc) - данных его соседи не смогут перекрыть удалённый элемент так как он NULL то есть сосед может закрыть свой указатель NULL крышка и тогда уже потеря контроля над указателем, если не понятно vector не сможет изменить размер вообще говоря вектор создавался для простых перменных и статических данных структур, объектов но не динамических. То что лучше использовать очередь - дек(deque<typename>) или list<typename> удаляй из любого места элементы имеет двойную ссылочную связь.


deque<string> dstr; // пример вставки строк
dstr.push_back("Molekula - H2O, H2 + O = H2O");
dstr.push_front("GPU NVIDIA");
dstr.push_front("GPU ATI Radeon");


deque<string>::iterator iter = dstr.begin(); // пример добавления данных в элементы
while( iter != dstr.end() ) {
int pos = 0;
if((pos = (*iter).find("H2O", 0)) != -1 ) { // поиск, вырезка
printf("sub = %s\n", (*iter).substr(pos, (*iter).length() - pos).c_str());
(*iter).append(" CPU(CISC,RISC, MISC)"); // добавление к строке
break;
}
*iter++;
}


deque<string>::iterator idel = dstr.begin(); // пример удаления по-индексу
idel += 1; // удалить второй элемент из очереди
dstr.erase(idel);

for(size_t c = 0u; c < dstr.size(); c++) // печатаем
printf("out = %s\n", dstr[c].c_str());

dstr.clear();

Тпа этого или хотел со вложенными в очередь структуры типа такого,
deque<vector<string> > - ?
Если так то здесь вообще не понимаю проблем.. :confused:
35K
13 марта 2011 года
life4fun
64 / / 15.11.2010
Цитата:
Может, пора сменить стиль?

стиль здесь ни при чём. чел просто барыжит потихоньку задания от своих одногруппников..



ребят не выдумывайте..

сори, сразу код не выложил, нэт отрубили на неделю, только решил проблему, вот собственно что с деком получилось:

Код:
#include <iostream>
#include <windows.h>
using namespace std;
 
class Node
{
public:
       
        char number[100];
        Node* next;
        Node* last;
};
 
void russia(const char*);

       
        short action = -1;
        Node* head = NULL;
        Node* tail = NULL;
        Node* lastPtr = NULL;
        Node* ptrLast = NULL;

        int i,j;
 
       int add()
       
               
                {
                       system("CLS");
                        Node* ptr = new Node;
                       
                        russia("Введите данные: ");
                        cin>>ptr->number;
                        ptr->next = NULL;
                        if (head == 0)
                        {
                                head = ptr;
                                lastPtr = ptr;
                                system("CLS");
                                return 0;;
                        }
                        lastPtr->next = ptr;
                        lastPtr = ptr;
                        system("CLS");
                        return 0;;
       }

     
              int  prosm()
                {
                    {
                       system("CLS");      
                        Node* ptr = NULL;
                       
                        if (head == NULL)
                        {
                                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                                system("PAUSE");
                                system("CLS");
                                return 0;                                
                        }
                        russia("* * * * * СПИСОК * * * * *\n\n");
                        ptr = head;
                        while (1)
                        {
                                cout<<ptr->number<<" ";
                                if (ptr->next == 0)
                                        break;
                                ptr = ptr->next;
                        }
                        cout<<"\n\n";
                        system("PAUSE");
                        system("CLS");
                        }
                        return 0;
                }
 
             
 
                int delhead()
                {
                        system("CLS");
                        Node* ptrDelete = NULL;                
                        if (head == NULL)
                        {
                                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                                system("PAUSE");
                                system("CLS");
                                return 0;
                               
                        }
                        if (head->next == NULL)
                        {
                                head = NULL;
                                tail = NULL;
                                delete head;
                               
                        }
                        ptrDelete = head;
                        head = ptrDelete->next;
                        head->last = NULL;
                        delete ptrDelete;
                        return 0;
                }
 
                int deltail()
                {
                        system("CLS");
                        Node* ptrDelete = NULL;
                        if (tail == NULL)
                        {
                                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                                system("PAUSE");
                                system("CLS");
                                return 0;
                        }
                        if (tail->last == NULL)
                        {
                                head = NULL;
                                tail = NULL;
                                delete tail;
                               
                        }                      
                        ptrDelete = tail;
                        tail = ptrDelete->last;
                        tail->next = NULL;
                        ptrLast = tail;
                        delete ptrDelete;
                        return 0;
                }
 
                int poisk()
                {
                        system("CLS");
                        Node* ptr = NULL;
                        char key [50];
                        if (head == NULL)
                        {
                                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                                system("PAUSE");
                                system("CLS");
                                return 0;
                               
                        }
                        russia("Введите Элемент Для Поиска: ");
                        cin>>key;                      
                        ptr = head;
                        while (1)
                        {
                                if (key == ptr->number)
                                {
                                        russia("\n\t!!! ЭЛЕМЕНТ НАЙДЕН !!!\n");
                                        break;
                                }
                                if (ptr->next == NULL)
                                {
                                        russia("\n\t!!! ЭЛЕМЕНТ НЕ НАЙДЕН !!!\n");
                                        break;
                                }
                                ptr = ptr->next;
                        }
                        system("PAUSE");
                        system("CLS");
                        return 0;
                }
 
                int proverka()
                {
                        Node* ptr = NULL;
                        system("CLS");
                        if (head == NULL)
                        {
                                russia("\t!!! СПИСОК ПУСТ !!!\n\n");
                                system("PAUSE");
                                system("CLS");
                                return 0;
                               
                        }
                         
                        if (head != NULL)
                        {
                            russia("\t!!! СПИСОК НЕ ПУСТ !!!\n\n");
                            system("PAUSE");
                            system("CLS");
                            return 0;
                           
                        }
                        return 0;
                }
        int del()
        {return 0;}
 
void russia(const char* rus)
{
        char word[120];
        CharToOem(rus, word);
        cout<<word;
}
 int main()
 {
     do
     {
                russia("1. Добавить Элемент\n");
                russia("2. Просмотр Списка \n");
                russia("3. Удалить Голову\n");
                russia("4. Удалить Хвост\n");
                russia("5. Поиск Элемента\n");
                russia("6. Проверить, пуст ли дек\n");
                russia("7. Очистить дек\n");
                russia("0. Выход\n\n");               
                russia("Ваш Выбор: ");
                cin>>action;

                switch (action)
                {
                case 1: add(); break;
                case 2: prosm(); break;
                case 3: delhead(); break;
                case 4: deltail(); break;
                case 5: poisk(); break;
                case 6: proverka(); break;
                case 7: del(); break;
                case 0: return 0; break;
                }
                russia("1. Продолжыть роботу\n");
                russia("0. Выйти\n");
                cin>>action;
                system("PAUSE");
                system("CLS");
     }
     while (action!=0);
     return 0;
}


почему-то не работает удаление хвоста, и еще не получилось сделать полную очистку дека, помогите это сделать пожалуйста!

и еще вопрос, как можно это реализовать немного проще, без класса?
297
14 марта 2011 года
koodeer
1.2K / / 02.05.2009
Глянул код мельком. Бросилось в глаза:
Цитата: life4fun
Код:
int delhead()
{
...
        if (head->next == NULL)
        {
                [COLOR="red"]head = NULL;[/COLOR]
                tail = NULL;
                [COLOR="red"]delete head;[/COLOR]                      
        }
...
}

int deltail()
{
...
        if (tail->last == NULL)
        {
                head = NULL;
                [COLOR="red"]tail = NULL;[/COLOR]
                [COLOR="red"]delete tail;[/COLOR]
        }
...
}



Цитата: life4fun
и еще вопрос, как можно это реализовать немного проще, без класса?


Дык у тебя по сути и сделано без класса. Набор глобальных функций.
А класс (нормально реализованный) банально удобней.

Вообще, в тырнете полным-полно исходников классов очередей, деков, строк на c++.


ADD:
Тьфу, выделение цветом всё ещё не работает. Но думаю, понятно, что я указал.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог