Другие языки программирования и технологии

Как реализовать cтек с помощью очереди?

 #include  
#include
using namespace std;
int main() {
stack box;
for (auto n = 1; n < 10; ++n) box.push(n);
while (!box.empty()) {
cout
Олег Ильязов
Олег Ильязов
87 195
Лучший ответ
И очередь, и стек эффективно реализуются списками, но по-разному. Николай Веселуха как раз реализацию списком и предложил. Но это НЕ "с помощью очереди".

С помощью очереди - эффективных реализаций не существует.

Очередь: добавляем в хвост, извлекаем из головы.
Стек: добавляем в голову, извлекаем из головы (такой вариант позволяет использовать однонаправленный список, тогда как "добавление в конец и удаление с конца" потребует двунаправленного списка).

Извлечение элементов у списка и очереди идентично но вставка при реализации стека очередью потребует ещё одной очереди и множества копирований:
 создаём временную очередь temp
заносим temp новый элемент
переносим все элементы из основной очереди в temp
переносим все элементы из temp в основную очередь
Типичное удаление гланд через задницу. Даже если просто менять очереди местами (без переноса из temp в основную очередь), получается крайне неэффективно.
Дима Швец А как же std::list
 #include   
#include
#include
using namespace std;
int main() {
stack box;
for (auto n = 1; n < 10; ++n) box.push(n);
while (!box.empty()) {
cout
Дима Швец И такой вариант возможен
 #include   
#include
#include
using namespace std;
int main() {
stack box;
for (auto n = 1; n < 10; ++n) box.push(n);
while (!box.empty()) {
cout
Эмулировать с помощью двух очередей.
Стек подразумевает две операции - добавление в конец и удаление с конца.
Очередь отличается тем, что удаляет с начала.

Костыльная реализация стека через очередь усложнит одну из двух операций до O(n).
Например, добавлять мы можем как в очередь, а при удалении перегонять все элементы, кроме последнего, в другую очередь, и возвращать последний элемент.
Х)
Хам ))
71 540