|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
09.05.2017, 12:38 | #1 |
Форумчанин
Регистрация: 09.04.2017
Сообщений: 598
|
Очередь
Здравствуйте!
Есть задача, организовать схему "очередь", как устройство хранения данных похожее на стек. Написал я вот такой код. Вроде работает по схеме. Первый вошел - первый вышел. Но терзают смутные сомнения, что что-то всё-таки не так. Потому что в задании упоминается про какой-то круговой буфер где начало и конец очереди циркулируют по нему вместе с данными. При этом всё должно быть в рамках использования массива. Код:
|
09.05.2017, 12:43 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Это бред написан. Очередь это контейнер и хочется видеть что-то типа:
Код:
И где же у вас кольцевой буфер? |
09.05.2017, 12:48 | #3 |
Форумчанин
Регистрация: 09.04.2017
Сообщений: 598
|
Ну контейнеры я положим еще не изучал.
Вот пример реализации стека, на основе пройденного материала учебника. Причем это пример предложенный автором учебника. Именно на его основе предлагается реализовать прием "очередь". Код:
Кроме того, именно круговой буфер меня и натолкнул на мысль, что есть другой вариант решения задачи. Ибо у себя я никаких кругов не наблюдаю. |
09.05.2017, 13:51 | #4 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Так и почему вы не реализовали на его основе?)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
09.05.2017, 14:37 | #5 |
Форумчанин
Регистрация: 09.04.2017
Сообщений: 598
|
Да я просто и представления не имел что это такое)))
Сейчас вот полазил по интернету и представление получил. Начал кумекать как это реализовать и заглянул сюда на форум, вот и пишу)))) Я не учусь в университете, я самоучка, у меня нет преподавателей, спросить не у кого, только вот тут на форуме. Ни фига не знаю короче))) Но этот код я напишу, там ничего сложного нет, понять просто схему надо было. |
09.05.2017, 14:47 | #6 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Дык причем тут это, я о том, что код очереди что-то совсем не похож на код стека, который вы вроде как брали за основу )
Откуда-то в ней появились функции со странными имена и консольным вводом/выводом и пропали нормальные функции для работы с ней (добавление/удаление элемента).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 09.05.2017 в 14:53. |
09.05.2017, 15:07 | #7 |
Форумчанин
Регистрация: 09.04.2017
Сообщений: 598
|
Да это по учебнику Р.Лафоре предложено взять за основу пример со стеком, где принцип последний вошел, первый вышел. Я и взял. Сделал по принципу первый вошел первый вышел. Но чую что-то не то. Какой-то круговой буфер... Вот и решил написать на форум. Как оказалось не зря.
|
09.05.2017, 15:13 | #8 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Кольцевой буфер это просто добавление снова в начало когда дошли до конца.
https://ru.wikipedia.org/wiki/%D0%9A...84%D0%B5%D1%80 Но тут не его обсуждали, а то, что вы как-то странно взяли за основу пример со стеком убрав из него весь нормальный интерфейс работы со структурой данных (push, pop, ...).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
09.05.2017, 15:30 | #9 |
Форумчанин
Регистрация: 03.03.2013
Сообщений: 102
|
Если делать с кольцевым буфером, нужно два указателя — на начало очереди и на конец. Добавляются элементы в конец, удаляются из начала. В пустой очереди индекс начала равен индексу конца. При добавлении элемента в очередь индекс конца увеличивается, при удалении элемента из очереди увеличивается индекс начала. Если какой-нибудь индекс становится равным максимальному размеру очереди, он обнуляется (в этом и есть "закольцовывание"), а заполненность очереди определяет условие (индекс_начала < индекс_конца)
Ну и функции для добавления элемента и удаления писать нужно как в примере со стёком, только с учётом вышесказанного) Ps: вернее, не меньше индекс начала должен быть, а "не равен" индексу конца при добавлении элемента (может быть равен только при удалении последнего элемента из очереди) Последний раз редактировалось Haric_110; 09.05.2017 в 15:42. |
09.05.2017, 17:21 | #10 |
Форумчанин
Регистрация: 09.04.2017
Сообщений: 598
|
Спасибо друзья!
Я уже написал, что понял смысл задачи и принялся за её решение. Стандартными средствами (push, pop, ...) пользоваться нельзя. Надо делать врукопашную. В этом смысл обучения этого Лафоре)) Сейчас слегка подзастрял на распределении именно момента стыковки догонялки одного индикатора другим. Думаю как сделать сохранение вывода с одновременным разделением индикаторов. Короче в сыром виде пока так: [CODE#include<iostream> #include<conio.h> using namespace std; class ochered { private: static const int MAX=10; int och[MAX]; int ind1, ind2; public: ochered(): ind1(0), ind2(1) {} void cikl() { for(int j=0; j<10; j++) och[j]=33; } void vvod() { int a; char ch='a'; while(ind2<=MAX) { cout<<"Введите значение для помещения в очередь: "; cin>>a; if(ind2==MAX) ind2=0; if(ind2==ind1) { cout<<"Массив заполнен! \n" <<"Если желаете заменить значение существующее сейчас в массиве на вводимое,\n" <<"нажмите d.\n" <<"Если желаете сначала вывести значение, нажмите v.\n"; cin>>ch; while(ch!='v' && ch!='d') { cout<<"Надо ввести v или d."; cin>>ch; } } if(ch=='v') { ind2=9; ch='a'; break; } och[ind2++]=a; if(ch=='d') ind1++; ch='a'; cout<<"Если желаете прервать ввод, нажмите n.\n" <<"Если желаете продолжить, нажмите любую клавишу.\n"; cin>>ch; if(ch=='n') break; } } void vyvod() { char ch='a'; cout<<"Вывод значений очереди.\n"; while(ind1<=MAX) { if(ind1==MAX) ind1=0; if(ind1==ind2) { cout<<"Очередь пуста!\n"; break; } cout<<"Выводимое значение равно: "<<och[ind1]<<endl; och[ind1]=0; ind1++; cout<<"Если желаете прервать вывод, нажмите n.\n" <<"Если желаете продолжить, нажмите любую клавишу.\n"; cin>>ch; if(ch=='n') break; } } }; int main() { setlocale(LC_ALL,"rus"); char ch='a'; ochered o1; o1.cikl(); cout<<"Программа имитирующая приём \"Очередь\".\n" <<"В данном случае очередь равна 10 ячейкам.\n"; do { cout<<"Вы желаете внести в очередь или вынести из очереди? \n" <<"Если внести, то нажмите +, если вынести, то нажмите -.\n"; cin>>ch; switch(ch) { case '+': o1.vvod(); break; case '-': o1.vyvod(); break; } cout<<"Желаете продолжить? Если да, нажмите любую клавишу. \n" <<"Если нет, нажмите n.\n"; cin>>ch; } while(ch!='n'); getch(); return 0; } ][/CODE] Доделаю, покажу как сделал))) |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
вводим 15 элементов в очередь, затем выводим на экран эту очередь и добавил в очередь еще один элемент. Потом удаляем любой элемен | Xumera | C++ Builder | 2 | 07.12.2013 13:56 |
Очередь | sys*.12 | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 05.12.2012 04:43 |
Очередь | fenix0093 | Помощь студентам | 1 | 30.11.2012 16:15 |
Очередь Си | svetikzo | Помощь студентам | 0 | 23.01.2010 10:03 |
Очередь C++ | svetikzo | Помощь студентам | 2 | 23.01.2010 09:53 |