Подскажите, как реализовать двустороннюю очередь (Дек) в СИ Какие аргументы необходимо передать в функции добавления элемента в начало дека и добавления элемента в конец дека?
Какие аргументы необходимо передать в функции извлечения элемента из начала дека и извлечения элемента из конца дека?
Как выглядят эти функции? (словесное описание)

9 Мар 2021 в 19:41
138 +1
0
Ответы
1

Двусторонняя очередь (дек) в C может быть реализована с использованием массива или связанного списка.

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

void addFront(int *deque, int *front, int *rear, int value) {
if ((*front == 0 && *rear == SIZE - 1) || (*rear == (*front - 1) % (SIZE - 1))) {
printf("Deque is full\n");
return;
}
if (*front == -1) {
*front = *rear = 0;
} else if (*front == 0) {
*front = SIZE - 1;
} else {
*front = (*front - 1) % (SIZE - 1);
}
deque[*front] = value;
}

Для добавления элемента в конец дека аргументы будут такими же - указатель на дек и значение элемента. Функция добавления в конец дека будет выглядеть примерно так:

void addRear(int *deque, int *front, int *rear, int value) {
if ((*front == 0 && *rear == SIZE - 1) || (*rear == (*front - 1) % (SIZE - 1))) {
printf("Deque is full\n");
return;
}
if (*front == -1) {
*front = *rear = 0;
} else if (*rear == SIZE - 1) {
*rear = 0;
} else {
*rear = (*rear + 1) % (SIZE - 1);
}
deque[*rear] = value;
}

Для извлечения элемента из начала дека необходимо передать указатель на дек. Функция извлечения элемента из начала дека может выглядеть примерно так:

int deleteFront(int *deque, int *front, int *rear) {
if (*front == -1) {
printf("Deque is empty\n");
return -1;
}
int value = deque[*front];
if (*front == *rear) {
*front = *rear = -1;
} else {
*front = (*front + 1) % SIZE;
}
return value;
}

Для извлечения элемента из конца дека также необходимо передать указатель на дек. Функция извлечения элемента из конца дека может выглядеть примерно так:

int deleteRear(int *deque, int *front, int *rear) {
if (*front == -1) {
printf("Deque is empty\n");
return -1;
}
int value = deque[*rear];
if (*front == *rear) {
*front = *rear = -1;
} else if (*rear == 0) {
*rear = SIZE - 1;
} else {
*rear = (*rear - 1) % SIZE;
}
return value;
}

Эти функции позволяют добавлять элементы в начало и конец дека, а также удалять элементы из начала и конца дека.

17 Апр 2024 в 20:44
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир