Задача
Реализуйте структуру данных «дек». Напишите программу, содержащую описание дека и моделирующую работу дека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
- push_front Добавить (положить) в начало дека новый элемент. Программа должна вывести ok.
- push_back Добавить (положить) в конец дека новый элемент. Программа должна вывести ok.
- pop_front Извлечь из дека первый элемент. Программа должна вывести его значение.
- pop_back Извлечь из дека последний элемент. Программа должна вывести его значение.
- front Узнать значение первого элемента (не удаляя его). Программа должна вывести его значение.
- back Узнать значение последнего элемента (не удаляя его). Программа должна вывести его значение.
- size Вывести количество элементов в деке.
- clear Очистить дек (удалить из него все элементы) и вывести ok.
- exit Программа должна вывести bye и завершить работу.
Гарантируется, что количество элементов в деке в любой момент не превосходит [latex]100[/latex]. Все операции:
pop_front,
pop_back,
front,
back
всегда корректны.
Входные данные
Описаны в условии. См. также пример входных данных.
Выходные данные
Описаны в условии. См. также пример входных данных.
Тесты
Входные данные | Выходные данные |
push_back 3 push_front 14 size clear push_front 1 back push_back 2 front pop_back size pop_front size exit |
ok ok 2 ok ok 1 ok 1 2 1 1 0 bye |
Код программы на 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#include <iostream> #include <string> using namespace std; struct deque{ #define Size 200000 int start, end; int folder[Size]; deque(){ start = end = Size/2; } void push_front(int var){ folder[--start] = var; cout << "ok" << endl; } void push_back(int var){ folder[end++] = var; cout << "ok" << endl; } void pop_front(){ cout << folder[start++] << endl; } void pop_back(){ cout << folder[--end] << endl; } void front(){ cout << folder[start] << endl; } void back(){ cout << folder[end-1] << endl; } void size(){ cout << end-start << endl; } void clear(){ start = end = Size/2; cout << "ok" << endl; } }; int main() { string s; deque deq; int n; while (cin >> s){ if (s == "push_front"){ cin >> n; deq.push_front(n); } else if (s == "push_back"){ cin >> n; deq.push_back(n); } else if (s == "pop_front") deq.pop_front(); else if (s == "pop_back") deq.pop_back(); else if (s == "front") deq.front(); else if (s == "back") deq.back(); else if (s == "size") deq.size(); else if (s == "clear") deq.clear(); else if (s == "exit"){ cout << "bye"; return 0; } } } |
Код программы на Java
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 52 53 54 55 56 57 58 59 60 61 62 63 64 |
import java.util.*; class deque{ private static final int Size = 200000; int start, end; int [] folder = new int[Size] ; deque(){ start = end = Size/2; } void push_front(int var){ folder[--start] = var; System.out.println("ok"); } void push_back(int var){ folder[end++] = var; System.out.println("ok"); } void pop_front(){ System.out.println(folder[start++]); } void pop_back(){ System.out.println(folder[--end]); } void front(){ System.out.println(folder[start]); } void back(){ System.out.println(folder[end-1]); } void size(){ System.out.println(end-start); } void clear(){ start = end = Size/2; System.out.println("ok"); } }; class Main { public static void main (String[] args) throws java.lang.Exception { Scanner scan = new Scanner(System.in); deque deq = new deque(); String S; while (scan.hasNext()){ S = scan.next(); if (S.equals("push_front")) deq.push_front(scan.nextInt()); else if (S.equals("push_back")) deq.push_back(scan.nextInt()); else if (S.equals("pop_front")) deq.pop_front(); else if (S.equals("pop_back")) deq.pop_back(); else if (S.equals("front")) deq.front(); else if (S.equals("back")) deq.back(); else if (S.equals("size")) deq.size(); else if (S.equals("clear")) deq.clear(); else if (S.equals("exit")){ System.out.println("bye"); System.exit(0); } } } } |
Решение
Создадим массив [latex]folder[/latex] и целочисленные переменные [latex]start[/latex] и [latex]end[/latex] в качестве указателей на начало и конец нашего дека.
- push_front — сдвигаем указатель [latex]start[/latex] на [latex]1[/latex] назад, кладем значение в наш дек и выводим ok;
- push_back — кладем значение в наш дек, сдвигаем указатель [latex]end[/latex] на [latex]1[/latex] вперед и выводим ok;
- pop_front — выводим значение начала дека и перемещаем [latex]start[/latex] вперед на [latex]1[/latex];
- pop_back — перемещаем [latex]end[/latex] назад на [latex]1[/latex] и выводим значение конца дека;
- front — выводим значение начала дека;
- back — выводим значение перед [latex]end[/latex];
- size — отнимем от переменной [latex]end[/latex] переменную [latex]start[/latex];
- clear — приводим [latex]start[/latex] и [latex]end[/latex] к изначальным позициям;
- exit — выводим «bye» и заканчиваем программу.
Ссылки
Ideone C++
Ideone Java
решение e-olymp C++
решение e-olymp Java
С точки зрения e-olymp всё хорошо. Но я считаю, что задача не решена.
Я ведь вижу код и мне понятно, что задание «Реализуйте структуру данных дек» не выполнено. Нужно создать класс или структуру с нужными методами.
Надо отступы поправить.