Задача:
Реализуйте структуру данных «дек«. Напишите программу, содержащую описание дека и моделирующую работу дека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push_front
Добавить (положить) в начало дека новый элемент. Программа должна вывести ok.
push_back
Добавить (положить) в конец дека новый элемент. Программа должна вывести ok.
pop_front
Извлечь из дека первый элемент. Программа должна вывести его значение.
pop_back
Извлечь из дека последний элемент. Программа должна вывести его значение.
front
Узнать значение первого элемента (не удаляя его). Программа должна вывести его значение.
back
Узнать значение последнего элемента (не удаляя его). Программа должна вывести его значение.
size
Вывести количество элементов в деке.
clear
Очистить дек (удалить из него все элементы) и вывести ok.
exit
Программа должна вывести bye и завершить работу.
Тесты:
Последовательность | Результат |
push_front 4 push_back 5 front push_front 3 back size pop_front pop_back clear pop_back size exit |
ok
ok 4 5
|
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 150 151 152 153 154 155 156 |
import java.util.Scanner; public class Deque { private class Node { Node prev; Node next; int x; Node() { prev = null; next = null; x = 0; } Node(Node a, Node b, int c) { prev = a; next = b; x = c; } }; Node Front = null; Node Back = null; int Size = 0; int size() { return Size; } void push_back(int p) { if (Size == 0) { Node NewNode = new Node(Back, Front, p); Front = NewNode; Back = NewNode; } else { Node NewNode = new Node(null, Back, p); Back.prev = NewNode; Back = NewNode; } Size++; } void push_front(int p) { if (Size == 0) { Node NewNode = new Node(Back, Front, p); Front = NewNode; Back = NewNode; } else { Node NewNode = new Node(Front, null, p); Front.next = NewNode; Front = NewNode; } Size++; } int back() { if (Size != 0) { return Back.x; } else { return 0; } } int front() { if (Size != 0) { return Front.x; } else { return 0; } } int pop_front() { if (Size != 0) { int x = Front.x; Node NewNode = Front.prev; Front = NewNode; Size--; return x; } else { return 0; } } int pop_back() { if (Size != 0) { int x = Back.x; Node NewNode = Back.next; Back = NewNode; Size--; return x; } else { return 0; } } void clear() { while (Size > 0) { Node NewNode = Front.prev; Front = NewNode; Size--; } Front = null; Back = null; } public static void main(String[] args) { Deque deque = new Deque(); Scanner scanner = new Scanner(System.in); System.out.println("enter your command"); String command = scanner.nextLine(); while (!command.equals("exit")) { if (command.equals("push_back")) { int v = scanner.nextInt(); deque.push_back(v); System.out.println("ok\n"); } else if (command.equals("push_front")) { int v = scanner.nextInt(); deque.push_front(v); System.out.println("ok\n"); } else if (command.equals("front")) { if (deque.size() > 0) { System.out.println(deque.front()); } else { System.out.println("error\n"); } } else if (command.equals("back")) { if (deque.size() > 0) { System.out.println(deque.back()); } else { System.out.println("error\n"); } } else if (command.equals("size")) { System.out.println(deque.size()); } else if (command.equals("pop_front")) { if (deque.size() > 0) { System.out.println(deque.pop_front()); } else { System.out.println("error\n"); } } else if (command.equals("pop_back")) { if (deque.size() > 0) { System.out.println(deque.pop_back()); } else { System.out.println("error\n"); } } else if (command.equals("clear")) { System.out.println("ok\n"); deque.clear(); } command = scanner.nextLine(); } System.out.println("bye"); } }; |
Решение
Решение на Ideone
Дек — (двухсторонняя очередь) — структура данных, в которой элементы можно добавлять и удалять как в начало, так и в конец, то есть дисциплинами обслуживания являются одновременно FIFO и LIFO. Для реализации дека неограниченного размера удобно использовать двусвязный список.