Укладка данных, извлечение значения, опускание стека - PullRequest
0 голосов
/ 25 сентября 2018

Возможно, я пропустил сообщение по этому вопросу или искал не тот вопрос в Интернете, поэтому, если есть что-то, что точно отвечает на этот вопрос, извините, пожалуйста, ссылку:)

Вопрос: Я пытаюсь создать массивчтобы сохранить несколько целых чисел по порядку,

data(1)
data(2)
data(3)
data(4)
data(5)

с завершенным массивом, программа находит среднее значение целых чисел, а затем перемещает стек вверх или удаляет самую старую (data1) запись и перемещает всю вещь вверхпо одному, поэтому он начинается:

data(2)
""
data(6)

и продолжается в цикле до тех пор, пока не завершится работа программного обеспечения.

1 Ответ

0 голосов
/ 25 сентября 2018

Стек - это структура данных LIFO.Похоже, вы хотите использовать очередь, которая представляет собой структуру данных FIFO.Это может быть выполнено с использованием циклического буфера .Это позволяет нам использовать простой массив.Пример поведения, описанного вами в вопросе, можно найти в следующем примере кода.

uint8_t qhead;
uint8_t qtail;
uint8_t qsize;
const uint8_t qcapacity = 5;
uint8_t qdata[qcapacity];

void queue_enqueue(const uint8_t data)
{
    // Check to make sure that we do not overflow
    if (qsize + 1 > qcapacity)
    {
        return;
    }

    qdata[qhead] = data;

    // Calculate the new head
    qhead = (qhead + 1) % qcapacity;
    qsize++;
}

uint16_t queue_dequeue(void)
{
    // Make sure there is something to dequeue
    if (qsize == 0)
    {
        return 0xFFFFFFFF;
    }

    uint8_t result = qdata[qtail];

    // Calculate the new tail
    qtail = (qtail + 1) % qcapacity;
    qsize--;

    return result;
}

void setup()
{
    qhead = 0;
    qtail = 0;
    qsize = 0;
}

void loop()
{
    uint8_t data = /* Input source here */;

    /* Need to fill the queue with qcapacity items first */
    if (qsize < qcapacity)
    {
        queue_enqueue(data);
    }
    else
    {
        /* Calculate the average */
        uint16_t average = 0;
        for (uint8_t i = 0; i < qsize; i += 1)
        {
            average += qdata[i];
        }
        average = average / qsize;

        /* Remove the old element */
        queue_dequeue();

        /* Add the new element */
        queue_enqueue(data);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...