Задача
Формулировка задания на e-olymp.
Реализуйте структуру данных «стек». Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
- push n — Добавить в стек число n (значение n задается после команды). Вывести ok.
- pop — Удалить из стека последний элемент. Программа должна вывести его значение.
- back — Вывести значение последнего элемента, не удаляя его из стека.
- size — Вывести количество элементов в стеке.
- clear — Очистить стек и вывести ok.
- exit — Вывести bye и завершить работу.
Гарантируется, что набор входных команд удовлетворяет следующим требованиям: максимальное количество элементов в стеке в любой момент не превосходит 100, все команды pop и back корректны, то есть при их исполнении в стеке содержится хотя бы один элемент.
Входные данные
Каждая строка содержит одну команду.
Выходные данные
Для каждой команды вывести в отдельной строке соответствующий результат.
Тесты
Входные данные | Выходные данные |
push 2 push 3 push 5 back size pop size push 7 pop clear size exit | ok ok ok 5 3 5 2 ok 7 ok 0 bye |
Отмечу так же, что программа успешно прошла все тесты на сайте e-olymp со следующими результатами.
Решение
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 |
class Stack { Vector<Integer> storage; public Stack() { storage = new Vector<Integer>(); } void push(int number) { this.storage.add(number); } int pop() { int lastNumber = storage.lastElement(); storage.remove(storage.size() - 1); return lastNumber; } int back() { int lastNumber = storage.lastElement(); return lastNumber; } int size() { return storage.size(); } void clear() { storage.clear(); } String exit() { return "bye"; } } public class Main { public static void main(String[] args) { Stack stack = new Stack(); Scanner input = new Scanner(System.in); int number; String request; while(input.hasNextLine()) { request = input.next(); if(request.equals("push")) { number = input.nextInt(); stack.push(number); System.out.println("ok"); } else if(request.equals("pop")) System.out.println(stack.pop()); else if(request.equals("back")) System.out.println(stack.back()); else if(request.equals("size")) System.out.println(stack.size()); else if(request.equals("clear")) { stack.clear(); System.out.println("ok"); } else if(request.equals("exit")) { System.out.println(stack.exit()); break; } } } } |
Пояснения
Структура класса Stack из себя представляет следующее:
- Динамический массив storage типа Vector<Integer> , который, по сути, и является хранилищем элементов стека;
- Конструктор, в котором происходит инициализация вектора storage ;
- Метод push(int number) типа void , который принимает как параметр число, и заносит это число в стек;
- Метод pop() типа int , который возвращает значение верхнего элемента стека и извлекает его;
- Метод back() типа int , который возвращает значение верхнего элемента стека, без его извлечения;
- Метод size() , который возвращает количество элементов, находящихся в стеке;
- Метод clear() , который очищает стек;
- Метод exit() типа String , который возвращает строку «bye».
Основная идея этого упражнения была в реализации стека «с нуля». Т.е. сделать это на основе массива или связного списка. Вы использовали класс Vector, который уже включает в себе реализацию стека на основе массива. Но я засчитываю работу т.к. она демонстрирует реализацию одного из шаблонов проектирования — делегирование.
Небольшое замечание. Не публикуйте ссылки с текстом, который не предназначен для чтения и запоминания читателем. Т.е. URL (например, http://ideone.com/o5byqF) не должен быть виден. Вы видите как я чделал ссылку на делегирование выше?
Спасибо за Вашу конкретику и конструктивное объяснение основной идеи данного упражнения. Оформление задачи было выполнено по примеру оформления самой первой задачи «Hello, World!». Ваше замечание было учтено и исправлено. Впредь буду осмотрительнее.
Очень хорошо, что написали об этом!
Исправил статью «Hello, World!» 🙂