Загрузка данных
// === 1. КЛАСС СТЕК (LIFO) ===
class Stack {
private int[] stackArray;
private int top; // Индекс верхнего элемента
public Stack(int size) {
stackArray = new int[size];
top = -1; // -1 означает, что стек пуст
}
public void push(int num) {
stackArray[++top] = num; // Двигаем указатель вверх и кладем число
}
public void pop() {
if (!isEmpty()) {
top--; // Просто сдвигаем указатель вниз (число затрется следующим push)
} else {
System.out.println("Стек пуст");
}
}
public int peek() {
return stackArray[top];
}
public boolean isEmpty() {
return (top == -1);
}
public int size() {
return top + 1;
}
public void printStack() {
System.out.print("Стек: ");
for (int i = 0; i <= top; i++) {
System.out.print(stackArray[i] + " ");
}
System.out.println();
}
}
// === 2. КЛАСС ОЧЕРЕДЬ (FIFO - КОЛЬЦЕВОЙ БУФЕР) ===
class Queue {
private int[] queueArray;
private int maxSize;
private int front; // Индекс начала очереди
private int rear; // Индекс конца очереди
private int elements; // Количество элементов в данный момент
public Queue(int size) {
maxSize = size;
queueArray = new int[maxSize];
front = 0;
rear = -1;
elements = 0;
}
public void push(int num) {
if (rear == maxSize - 1) {
rear = -1; // Зацикливаем указатель в начало массива, если дошли до конца
}
queueArray[++rear] = num;
elements++;
}
public void pop() {
if (!isEmpty()) {
front++;
if (front == maxSize) {
front = 0; // Зацикливаем указатель начала
}
elements--;
} else {
System.out.println("Очередь пуста");
}
}
public int peek() {
return queueArray[front];
}
public boolean isEmpty() {
return (elements == 0);
}
public int size() {
return elements;
}
public void printQueue() {
System.out.print("Очередь: ");
int count = 0;
int current = front;
while (count < elements) {
System.out.print(queueArray[current] + " ");
current++;
if (current == maxSize) {
current = 0;
}
count++;
}
System.out.println();
}
}
// === 3. КЛАСС ПРИОРИТЕТНАЯ ОЧЕРЕДЬ (СОРТИРОВАННЫЙ МАССИВ) ===
class Priority {
private int maxSize;
private int[] priorityArray;
private int elements; // Количество элементов
public Priority(int size) {
maxSize = size;
priorityArray = new int[maxSize];
elements = 0;
}
public void push(int num) {
if (elements == 0) {
priorityArray[0] = num; // Если пуста, просто кладем на первое место
} else {
int j;
// Идем с конца и сдвигаем элементы, которые больше нового числа
for (j = elements - 1; j >= 0; j--) {
if (num < priorityArray[j]) {
priorityArray[j + 1] = priorityArray[j];
} else {
break; // Нашли правильное место
}
}
priorityArray[j + 1] = num; // Вставляем число
}
elements++;
}
public void pop() {
if (!isEmpty()) {
// Чтобы не делать медленный сдвиг всего массива влево при удалении,
// мы считаем самым приоритетным элементом тот, что лежит в самом КОНЦЕ.
// Так мы удаляем элемент за мгновенное уменьшение счетчика!
elements--;
} else {
System.out.println("Приоритетная очередь пуста");
}
}
// Самый приоритетный (минимальный) элемент теперь всегда в конце заполненной части
public int peek() {
return priorityArray[elements - 1];
}
public boolean isEmpty() {
return (elements == 0);
}
public int size() {
return elements;
}
public void printPriority() {
System.out.print("Приоритетная очередь (от больших к меньшим): ");
for (int i = 0; i < elements; i++) {
System.out.print(priorityArray[i] + " ");
}
System.out.println();
}
}
// === 4. ОСНОВНОЙ КЛАСС ДЛЯ ЗАПУСКА ===
public class Main {
public static void main(String[] args) {
System.out.println("=== СТЕК ===");
Stack stack = new Stack(5);
stack.push(1);
stack.push(2);
stack.push(3);
stack.printStack(); // Стек: 1 2 3
System.out.println("Размер: " + stack.size());
System.out.println("Вершина (peek): " + stack.peek());
stack.pop();
stack.printStack(); // Стек: 1 2
System.out.println("\n=== ОЧЕРЕДЬ ===");
Queue queue = new Queue(5);
queue.push(10);
queue.push(20);
queue.push(30);
queue.printQueue(); // Очередь: 10 20 30
System.out.println("Размер: " + queue.size());
System.out.println("Первый элемент (peek): " + queue.peek());
queue.pop();
queue.printQueue(); // Очередь: 20 30
System.out.println("\n=== ПРИОРИТЕТНАЯ ОЧЕРЕДЬ ===");
Priority pr = new Priority(5);
pr.push(50);
pr.push(30);
pr.push(70);
pr.push(20);
pr.printPriority(); // Выведет внутренности массива: 70 50 30 20
System.out.println("Размер: " + pr.size());
System.out.println("Приоритетный элемент (peek): " + pr.peek()); // Минимальный элемент: 20
pr.pop(); // Удалили 20
pr.printPriority(); // Выведет оставшиеся: 70 50 30
}
}