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

С++ «Неделя вторая - Контейнер vector - Очередь» #10

Войти
Регистрация
Восстановить пароль
Оценить эту запись

С++ «Неделя вторая - Контейнер vector - Очередь» #10

Запись от acmades размещена 15.07.2017 в 18:29

Основы разработки на C++: белый пояс
С этим заданием повозился...
Задание:
Люди стоят в очереди, но никогда не уходят из её начала, зато могут приходить в конец и уходить оттуда. Более того, иногда некоторые люди могут прекращать и начинать беспокоиться из-за того, что очередь не продвигается.

Реализуйте обработку следующих операций над очередью:

WORRY i: пометить i-го человека с начала очереди (в нумерации с 0) как беспокоящегося;
QUIET i: пометить i-го человека как успокоившегося;
COME k: добавить k спокойных человек в конец очереди;
COME -k: убрать k человек из конца очереди;
WORRY_COUNT: узнать количество беспокоящихся людей в очереди.
Изначально очередь пуста.

Формат ввода
Количество операций Q, затем описания операций.
Для каждой операции WORRY i и QUIET i гарантируется, что человек с номером i существует в очереди на момент операции.
Для каждой операции COME -k гарантируется, что k не больше текущего размера очереди.

Формат вывода
Для каждой операции WORRY_COUNT выведите одно целое число — количество беспокоящихся людей в очереди.

Пример:
Ввод
8
COME 5
WORRY 1
WORRY 4
COME -2
WORRY_COUNT
COME 3
WORRY 3
WORRY_COUNT
Вывод
1
2
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
#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>
using namespace std;
void Worry(int& i, vector<bool>& x) {
    x[i] = true; // помечаю i-тый элемент (единичкой в векторе)
}
void Quiet(int& i, vector<bool>& x) {
    x[i] = false; // помечаю i-тый элемент (нолем в векторе)
}
void Come(int n, vector<bool>& x) { //функция убрает или прибавляет к концу вектора элементы(старые значения не меняет) 
    int q = x.size(); // измерили исходный вектор
    x.resize(q + (n)); // изменяем размер, при расширении нолями дополнится, при уменьшении обрежется, оставшиеся значения не изменит
}
void Worry_count(const vector<bool>& x) { //выводит количество "сердитых" единичек
    int counts = 0;
    for (auto i : x) {
        if (i==1) { //если встретим единичку(true), то засчитываем её
            counts++;
        }
    }
    cout << counts << endl; //выводим сколько единичек нашли
}
int main()
{
    int Q;
    cin >> Q; //ввели количество операций
    vector<bool> stack; //создали пустой вектор, принимающий только 0 или 1
    for (int i = 0; Q > i; i++) { //и пока лимит строк не закончится считываем их и выполняем по ходу
        string s; //текстовая составляющая
        int col; //циферка
        cin >> s; //прочитали текст...
        if (s == "WORRY_COUNT") { //если это запрос "вывести количество единичек" ...
            Worry_count(stack); //выводим функцией; а циферку не запрашиваем
        }
        else {
            cin >> col; //иначе запрашиваем циферку
            if (s == "WORRY") { //если запрос на "пометить сердитого", то ...
                Worry(col, stack); // помечаем
            }
            else if (s == "QUIET") { //иначе, если запрос на "убрать сердитость", то ...
                Quiet(col, stack); // убираем
            }
            else if (s == "COME") { //ну или обрезаем, или добавляем очередь
                Come(col, stack); //этой функцией
            }
        }
    }
    return 0;
}
Возможно нагромоздил немного. Но старался сильно не раздувать. Кто подскажет где тут можно уменьшить, покомпактнее сделать?
Всего комментариев 0

Комментарии

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