Задача с сайта e-olymp.com.
Условие задачи
Реализуйте структуру данных «дек». Напишите программу, содержащую описание дека и моделирующую работу дека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push_front
Добавить (положить) в начало дека новый элемент. Программа должна вывести ok.
push_back
Добавить (положить) в конец дека новый элемент. Программа должна вывести ok.
pop_front
Извлечь из дека первый элемент. Программа должна вывести его значение.
pop_back
Извлечь из дека последний элемент. Программа должна вывести его значение.
front
Узнать значение первого элемента (не удаляя его). Программа должна вывести его значение.
back
Узнать значение последнего элемента (не удаляя его). Программа должна вывести его значение.
size
Вывести количество элементов в деке.
clear
Очистить дек (удалить из него все элементы) и вывести ok.
exit
Программа должна вывести bye и завершить работу.
Гарантируется, что количество элементов в деке в любой момент не превосходит 100. Перед исполнением операций pop_front, pop_back, front, back программа должна проверять, содержится ли в деке хотя бы один элемент. Если во входных данных встречается операция pop_front, pop_back, front, back, и при этом дек пуст, то программа должна вместо числового значения вывести строку error.
Входные данные
Каждая строка содержит одну команду.
Выходные данные
Для каждой команды вывести в отдельной строке соответствующий результат.
Тесты
№ | Входные данные | Выходные данные |
1 | front back pop_back pop_front exit |
error error error error bye |
2 | push_back 1 back exit |
ok 1 bye |
3 | push_back 1 push_front 2 back front size clear size pop_back exit |
ok ok 1 2 2 ok 0 error bye |
Код программы
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
import java.util.*; import java.io.*; class DequeException extends Exception {} class Node <T> { T val; Node prev, next; Node(T v, Node p, Node n) {val = v; prev = p; next = n;} } class MyDeque <T> { int size; Node<T> first, last; MyDeque() { size = 0; first = null; last = null; } String pushBack(T val) { if (size > 0) { Node currentNode = new Node<T> (val, last, null); last.next = currentNode; last = currentNode; size++; } else { Node currentNode = new Node<T> (val, null, null); last = currentNode; first = currentNode; size++; } return "ok"; } String pushFront(T val) { if (size > 0) { Node currentNode = new Node<T> (val, null, first); first.prev = currentNode; first = currentNode; size++; } else { Node currentNode = new Node<T> (val, null, null); last = currentNode; first = currentNode; size++; } return "ok"; } T popFront() throws DequeException { if(size == 0) throw new DequeException(); T v = first.val; first = first.next; size--; return v; } T popBack() throws DequeException { if(size == 0) throw new DequeException(); T v = last.val; last = last.prev; size--; return v; } T front() throws DequeException { if(size == 0) throw new DequeException(); return first.val; } T back() throws DequeException { if(size == 0) throw new DequeException(); return last.val; } int getSize() { return size; } String clear() { size = 0; return "ok"; } String ex() { return "bye"; } } class Main { public static void main (String[] args) { Scanner in = new Scanner(System.in); PrintWriter out = new PrintWriter(System.out); MyDeque<String> deque = new MyDeque<String>(); String s, val; while(in.hasNext()) { s = in.next(); if (s.equals("exit")) out.println(deque.ex()); else if (s.equals("clear")) out.println(deque.clear()); else if (s.equals("size")) out.println(deque.getSize()); else if (s.equals("back")) { try { out.println(deque.back()); } catch(DequeException e) { out.println("error"); } } else if(s.equals("front")) { try { out.println(deque.front()); } catch(DequeException e) { out.println("error"); } } else if (s.equals("pop_back")) { try { out.println(deque.popBack()); } catch(DequeException e) { out.println("error"); } } else if (s.equals("pop_front")) { try { out.println(deque.popFront()); } catch(DequeException e) { out.println("error"); } } else if(s.equals("push_back")) { val = in.next(); out.println(deque.pushBack(val)); } else if(s.equals("push_front")) { val = in.next(); out.println(deque.pushFront(val)); } out.flush(); } } } |
Описание
Структура данных «дек» реализована в виде двусвязного списка. В классе MyDeque реализованы все требуемые методы. Те из них, после вызова которых, по условию, программа должна вывести некоторую строку, возвращают эту строку («ok» или «bye»). При попытке удалить или просмотреть элемент пустого дека создаётся и передаётся новый объект класса DequeException, наследующего класс Exception. В ходе работы функции main создаётся объект класса MyDeque, после чего читаются строки из входного потока и выполняются требуемые команды. В случае, если перехватывается исключение, выводится строка «error».
Код на ideone.com.
Засчитанное решение на e-olymp.com.