Проверьте, отсортирована ли очередь в порядке возрастания - PullRequest
0 голосов
/ 03 апреля 2020

Не могу понять, почему нижеприведенная программа работает не так, как задумано. После ввода отрицательного целочисленного значения и прерывания первого, пока l oop в main, управление программой не продолжается. Я пытался очистить поток вывода в различных ключевых точках, но проблема не исчезла.

#include <iostream>
#include <queue>

bool checkValidity(const std::queue<int>& q) {

    for(auto i = q.front(); i != q.back(); ++i){
        if (q.empty() || q.size() <= 1){
            std::cout << "invalid entry, insufficient elements" << '\n';
            return false;
            break;
        }
        if (i > ++i) {
            std::cout << "invalid entry, not properly sorted" << '\n';
            return false;
            break;
        }                 
    }   
    std::cout << "valid entry, properly sorted" << '\n';
    return true;
}

const char* bool_cast(const bool b) {
    return b ? "true" : "false";
}        

int main () {
    std::queue<int> numbers;
    int temp;

    std::cout << "Pushing..." << '\n';
    while(temp >= 0){
        std::cout << "Enter numbers: ";
        std::cin >> temp;
        if(temp >= 0){
            numbers.push(temp);
        }
    }

    bool ck = checkValidity(numbers);
    std::cout << bool_cast(ck) << '\n';

    std::cout << "{ ";
    while(numbers.size() > 0){
        std::cout << numbers.front();
        numbers.pop();
        std::cout << " ";
    }
    std::cout << "}" << '\n';

    return 0;
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Вы не можете выполнять итерацию по очереди, поэтому для итерации необходимо скопировать очередь в другую очередь, а затем перейти, вытолкнув элементы из очереди. и сравнение элементов.

Добавлены встроенные комментарии для лучшего понимания кода.

bool checkValidity(const std::queue<int>& q) {

    if (q.empty() || q.size() <= 1){ // This can be outside the loop and checked only onces
            std::cout << "invalid entry, insufficient elements" << '\n';
            return false;
    }
    std::queue<int> numbers=q; // a new queue to copy the queue
    int first=numbers.front(); // to compare we need to variable first and second
    numbers.pop();// pop the first value,as it is stored in first variable
    int second;
    while(!numbers.empty()){
        second=numbers.front();
        numbers.pop();
        if (first> second) { // compare the first and second variable
            std::cout << "invalid entry, not properly sorted" << '\n';
            return false;
            break;
        }
        first=second; // assign second to first and traverse the reamining queue
    }
    std::cout << "valid entry, properly sorted" << '\n';
    return true;
}

Надеюсь, эта помощь.

0 голосов
/ 03 апреля 2020

Наследуется от std :: queue и использует его защищенный член Container c; для доступа к begin () и end () нижележащего контейнера, как это было сделано ранее std :: queue iteration .

#include <iostream>
#include <queue>
#include <deque>
#include <iterator>

template<typename T, typename Container=std::deque<T> >
class iterable_queue : public std::queue<T,Container>
{
public:
    typedef typename Container::iterator iterator;
    typedef typename Container::const_iterator const_iterator;

    iterator begin() { return this->c.begin(); }
    iterator end() { return this->c.end(); }
    const_iterator begin() const { return this->c.begin(); }
    const_iterator end() const { return this->c.end(); }
};


bool checkValidity(iterable_queue<int>& q) {
    if (q.empty() || q.size() <= 1){
        std::cout << "invalid entry, insufficient elements" << '\n';
        return false;
    }
    while(q.size()){
        auto i = q.begin();
        auto j = ++q.begin();
        for(; i < q.end() && j < ++q.end();){
            std::cout << *i << " " << *j << '\n';
            if (*(i) > *(j)) {
                std::cout << "invalid entry, not properly sorted" << '\n';
                return false;
            }
            i++, j++;
        }   
        std::cout << "valid entry, properly sorted" << '\n';
        return true;
    }
    std::cout << "invalid entry, insufficient elements" << '\n';
    return false;
}

const char* bool_cast(const bool b) {
    return b ? "true" : "false";
}        

int main () {
    iterable_queue<int> numbers;
    int temp;

    std::cout << "Pushing..." << '\n';
    while(temp >= 0){
        std::cout << "Enter numbers: ";
        std::cin >> temp;
        if(temp >= 0){
            numbers.push(temp);
        }
    }

    bool ck = checkValidity(numbers);
    std::cout << bool_cast(ck) << '\n';

    std::cout << "{ ";
    while(numbers.size() > 0){
        std::cout << numbers.front();
        numbers.pop();
        std::cout << " ";
    }
    std::cout << "}" << '\n';

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...