Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.87
TheMachinist
244 / 176 / 15
Регистрация: 14.06.2010
Сообщений: 422
#1

Очередь - C++

04.09.2010, 16:19. Просмотров 4432. Ответов 40
Метки нет (Все метки)

Привет всем.
Я тут решаю в общем то простое упражнение - нужно проверить переполнение и опустошение очереди.
Есть у меня небольшая трудность:
как выйти из функции Decueue() (англ.вывести из очереди ) если Очередь пуста(tail == 0)???
Я пробовал exit(1) и return(0), но это все не то.

А главная трудность - по заданию упражнения проверку надо реализовать при помощи оператора %


Я только понимаю что с помощью % можно сделать процесс постановки в очередь бесконечным
(ставя первый элемент выталкивать последний) :

tail = (tail+1)%5;

Кто-нибудь????
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2010, 16:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Очередь (C++):

Очередь (сделать очередь, чтобы добавляло, удаляло, читало. Не STL.) - C++
Помогите пожалуйста написать очередь. Есть Температура double и ее тип int ну и нужно сделать очередь, чтобы добавляло, удаляло, читало....

Сформировать очередь по файлу целых чисел. Промоделировать очередь в супермаркете - C++
Сформировать очередь по файлу целых чисел. Промоделировать очередь в супермаркете. В каждый момент времени происходит одно из событий:...

Задача на очередь (вывод сообщения, что очередь пуста) - C++
Доброго дня! Есть задачка на очередь, которая работает нормально, только надо добавить код, чтобы выводил сообщение, что очередь пуста.....

Очередь, теория. Очередь на шести стеках - C++
Здравствуйте, пытаюсь побольше найти информации про очереди и их применение в программировании. Из того что я нашел, все описывается лишь...

Создать очередь. Добавить элемент в очередь. Удалить элемент из очереди - C++
Нужно создать очередь. Добавить элемент в очередь. Удалить элемент из очереди. Вот моё "творение". int main() { int...

Очередь - C++
Описать структуру с именем TRAIN, содержащую следующие поля: - название пункта назначения - номер поезда - время отправления ...

40
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.09.2010, 00:35 #16
А вот так уже лучше.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <stdexcept>
 
class Queue
{
        int head; int tail;
        int q[5];
 
public:
        Queue() : head(0), tail(0) {}
        void Enqueue(int var);
        int GetNum();
int Dequeue();
};
 
void Queue::Enqueue(int var)
{
        if(tail < 5)
        {
        q[tail] = var;
        tail++;
        }
}
 
int Queue::GetNum()
{
        return tail;
}
 
int Queue::Dequeue()
{
        if(tail > 0)
        {
                tail--;
                return q[tail];
        }
        else
           throw std::runtime_error("Queue is empty!");
}
 
int main()
{
        Queue q1;
setlocale(LC_ALL,"Rus");
 
std::cout << "Вместимость очереди: 5" << std::endl;
std::cout << "Кол-во элементов в очереди после попытки вместить туда 10 элементов: ";
 
        for(int i = 0;i < 10;i++)
                q1.Enqueue(i);
 
        std::cout << q1.GetNum() << std::endl;
 
        std::cout << "Попытка извлечь из очереди 10 элементов: " << std::endl;
        for(int i = 0;i < 10;i++)
        {
                std::cout <<    q1.Dequeue();
        }
 
        std::cin.get();
}
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
05.09.2010, 00:38 #17
Цитата Сообщение от NikolaWhite Посмотреть сообщение
думал для вас этот вопрос пустяк.
Так Вам же целых три примера привели... Ну не будет оно так, как у Вас написано, нормально работать. Лучше разберитесь с тем, что мы Вам тут насоветовали...
0
bobromet
24 / 24 / 1
Регистрация: 06.03.2010
Сообщений: 59
05.09.2010, 01:07 #18
NikolaWhite, скопировал твой последний код, вставил exit(1) в Dequeue() - все работает.
цифры 4 3 2 1 0 - выводит, просто потом чепухой забивается, ничего удивительного. Исключение тоже выбрасывает. Попробуй утром еще раз. А я тут алгоритмы.)
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
05.09.2010, 01:19 #19
Цитата Сообщение от Lavroff Посмотреть сообщение
return q[tail];
Минуточку! Это ж стек получится, а нужно очередь...
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.09.2010, 01:21 #20
easybudda, Дык я как бэ ничего не менял.
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
05.09.2010, 01:53 #21
Цитата Сообщение от Lavroff Посмотреть сообщение
Дык я как бэ ничего не менял.
Ну у Вас просто код понятнее написан.

NikolaWhite, Вы уж определитесь - Вам стек, очередь, или объяснить, чем они отличаются?
Стек работает по принципу "последним вошёл - первым вышел". Очередь - "Первым вошёл - первым вышел". У Вас Dequeue() возвращает последний помещённый элемент, а должна бы первый...
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.09.2010, 02:05 #22
Если я что-то еще понимаю то как-то так...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <stdexcept>
 
class Queue
{
        int head; int tail;
        int q[5];
 
public:
        Queue() : head(0), tail(0) {}
        void Enqueue(int var);
        int GetNum();
int Dequeue();
};
 
void Queue::Enqueue(int var)
{
        if(tail < 5)
        {
        q[tail] = var;
        tail++;
        }
}
 
int Queue::GetNum()
{
        return tail;
}
 
int Queue::Dequeue()
{
    int l=0;
        if(head < 5)
        {
                l=q[head];
                head++;
                return l;
        }
        else
           throw std::runtime_error("Queue is empty!");
}
 
int main()
{
        Queue q1;
setlocale(LC_ALL,"Rus");
 
std::cout << "Вместимость очереди: 5" << std::endl;
std::cout << "Кол-во элементов в очереди после попытки вместить туда 10 элементов: ";
 
        for(int i = 0;i < 10;i++)
                q1.Enqueue(i);
 
        std::cout << q1.GetNum() << std::endl;
 
        std::cout << "Попытка извлечь из очереди 10 элементов: " << std::endl;
        for(int i = 0;i < 10;i++)
        {
                std::cout <<    q1.Dequeue();
        }
 
        std::cin.get();
}
А может и так логичнее...

C++
1
2
3
4
5
6
int Queue::Dequeue()
{
        if(head>4)
           throw std::runtime_error("Queue is empty!");
        return q[head++];
}
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
05.09.2010, 02:17 #23
Lavroff, и всё бы ничего, но при таком подходе очередь только один раз заполнится и очистится, повторно объект такого класса использовать не получится. Мало того, элементы должны добавляться и удаляться из очереди в произвольной последовательности (с учётом ограничения размера очереди). Попробуйте не пытаться туда сразу 10 объектов запихнуть, а 5, потом их из очереди извлечь и 5 других записать...
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
05.09.2010, 02:22 #24
easybudda, Добавляться да, в произвольной. А удаляться насколько я понимаю в зависимости от того как заполнились, ибо FIFO по идее.
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
05.09.2010, 02:33 #25
Lavroff, не, я не про это... Вот в моём примере можно записать 3 элемента, потом прочитать 2, записать 4, прочитать все 5, потом записать ещё пару и прочитать их, а вот с Вашим кодом так не получится...
0
ForEveR
05.09.2010, 02:36
  #26

Не по теме:

easybudda, Если бы ТС внятно сказал, что он хочет)
А так. Я и не пытался сделать что-то особое)

0
fasked
Эксперт С++
4951 / 2531 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.09.2010, 09:08 #27
Цитата Сообщение от easybudda Посмотреть сообщение
При извлечении первого элемента все остальные прийдётся на шаг влево смещать, а это очень накладно, каким бы образом ни было реализовано.
Именно, поэтому реализация очереди и стека на основе массива отличается именно этим моментом.
Вот пример реализации очереди на основе массива. Как видно в функции pop существует цикл для перемещения элементов, это не страшно для маленьких очередей, но для большого количества элементов просто ужас
Правда код на Си. Но суть должна быть ясна.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
 
#define MAX_QUEUE_SIZE 0xF
 
typedef struct QUEUE {
    int array[MAX_QUEUE_SIZE];
    int rear;
} queue_t;
 
void erase(queue_t *q) {
    q->rear = MAX_QUEUE_SIZE;
}
 
int is_empty(queue_t *q) {
    return q->rear == MAX_QUEUE_SIZE;
}
 
void push(queue_t *q, int value) {
    if(q->rear == 0)
        fprintf(stderr, "queue is full\n");
    else
        q->array[--(q->rear)] = value;
}
 
int front(queue_t *q) {
    if(is_empty(q)) {
        fprintf(stderr, "queue is empty\n");
        return 0;
    }
    
    return q->array[MAX_QUEUE_SIZE - 1];
}
 
void pop(queue_t *q) {
    int i;
    
    if(is_empty(q)) {
        fprintf(stderr, "queue is empty\n");
        return;
    }
    
    for(i = MAX_QUEUE_SIZE - 1; i > q->rear; --i)
        q->array[i] = q->array[i-1];
    
    ++(q->rear);
}
 
int main()
{
    int i;
    queue_t q;
    
    erase(&q);
    for(i = 0; i < 10; ++i)
        push(&q, i + 1);
        
    while(!is_empty(&q)) {
        printf("%d -> ", front(&q));
        pop(&q);
    }
    printf("\b\b\b   \n");
}
0
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
05.09.2010, 11:29 #28
Цитата Сообщение от NikolaWhite Посмотреть сообщение
А у меня это не работает почему то, так же как и exit(1)
Это помому, что:
  1. код, который может возбуждать исключения, нужно помещать внутри блока try;
  2. выброшенное исключение нужно обработать внутри соответсвующего блока catch.
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
05.09.2010, 12:13 #29
Nameless One, если выполнение дойдёт до строки
C++
1
throw std::runtime_error("bla bla bla");
то программа и без всяких try/catch грохнется...
1
Nameless One
Эксперт С++
5777 / 3427 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
05.09.2010, 12:20 #30
Спасибо. Жаль, что в книжке, которую я читал, про это не было написано.
0
05.09.2010, 12:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2010, 12:20
Привет! Вот еще темы с ответами:

Очередь - C++
Всем приветики! Если кто нибудь знает помогите пожалуйста вот с такой задачкой. Есть какая-то очередь с элементами, нужно найти все...

с++ очередь - C++
Ребят создал очередь. Ввод и удаление. есть проблемы с выводом. скину шапку и код на удаление using namespace std; const int N=6; ...

Очередь - C++
Реализуйте структуру данных &quot;очередь&quot; на основе циклического массива или другим способом. Входные данные В каждой строке входных...

Очередь С++ - C++
Дан текстовый файл Вводятся с клавы числа А и В Надо вывести НА ЭКРАН СНАЧАЛА ВСЕ ЧИСЛА меньше А затем между А и В а затем больш В ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.