Задача
Стек с защитой от ошибок
Реализуйте структуру данных «стек«. Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push n
Добавить в стек число n (значение n задается после команды). Программа должна вывести ok.
pop
Удалить из стека последний элемент. Программа должна вывести его значение.
back
Программа должна вывести значение последнего элемента, не удаляя его из стека.
size
Программа должна вывести количество элементов в стеке.
clear
Программа должна очистить стек и вывести ok.
exit
Программа должна вывести bye и завершить работу.
Входные данные
Команды для стека.
Выходные данные
Соответствующие значения для каждой команды(см. выше).
Тесты
№ | Последовательность | Результат |
1 | push 2 back pop size pop push 1 size exit |
ok 2 2 0 error ok 1 bye |
2 | push 3 push 1 push 5 size pop size exit |
ok ok ok 3 5 2 bye |
3 | back push 9 pop pop exit |
error ok 9 error bye |
4 | size push 1 size back pop exit |
0 ok 1 1 1 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 |
import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; class Stack { private int pointer; private int[] stack; private int size; public Stack() { this(20); } public Stack(int capacity) { size = capacity; stack = new int[size]; pointer = -1; } public void push(int element) { stack[++pointer] = element; } public int pop() { int i = stack[pointer]; stack[pointer--] = 0; return i; } public int back() { return stack[pointer]; } public void clear() { Arrays.fill(stack, 0); pointer = -1; } public boolean isEmpty() { if (pointer < 0) return true; else return false; } public int size() { return this.pointer + 1; } public static void main(String[] args) { Stack stack = new Stack(); Scanner scanner = new Scanner(System.in); System.out.println("enter your command"); String command = scanner.nextLine(); while (!command.equals("exit")) { if (command.matches("^push [0-9]")) { String[] comm = command.split(" "); stack.push(Integer.parseInt(comm[1])); System.out.println("OK"); } else if (command.equals("pop")) { if (stack.isEmpty()) { System.out.println("Error. Stack is empty"); } else { System.out.println(stack.pop()); } } else if (command.equals("size")) { System.out.println(stack.size()); } else if (command.equals("back")) { if (stack.isEmpty()) { System.out.println("Error. Stack is empty"); } else { System.out.println(stack.back()); } } else if (command.equals("clear")) { stack.clear(); System.out.println("OK"); } else { System.out.println("Command doesn't exist"); } command = scanner.nextLine(); } System.out.println("bye"); } } |
Решение
Создаем структуру в которой реализуем все команды для стека с помощью функций и указателя . указывает на последний элемент в строке. Изначально , т.к. элементы в массиве, на которые бы он указывал, отсутствуют.
записывает в ячейку с номером элемент . возвращает т.е. действительный размер стека. возвращает последний помещённый в стек элемент, то есть элемент с номером , при этом удаляя его из стека. возвращает последний помещённый в стек элемент, то есть элемент с номером .В обоих случаях для проверки того, пуст ли стек, используется логическая функция . обнуляет массив и присваивает начальное значение = -1.Команды считываются и выполняются пока не будет введено , после чего выведется соответствующее сообщение и программа завершится.
Ссылка на Ideone