4 курс / СиАОД пример 4
.docxФедеральное агентство связи
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра Математической Кибернетики и Информационных Технологий
Отчет по лабораторной работе
по предмету «СиАОД»
на тему:
«Стек, очередь и дек»
Выполнил: студент группы _____
______
Руководитель:
Кутейников Иван Алексеевич
Москва 2021
Цель работы
Используя технологию модульного программирования разработать программу обработки данных, содержащихся в заранее подготовленном файле, в соответствии с индивидуальным заданием. Применить динамическую структуру указанного в задании вида: стек, очередь или дек. Программа должна включать модуль, содержащий набор всех необходимых средств (типов, подпрограмм и т.д.) для решения поставленной задачи.
Вариант 5
Даны три стержня и n дисков различного размера. Диски можно надевать на стержни, образуя из них башни. Перенести n дисков со стержня А на стержень С, сохранив их первоначальный порядок. При переносе дисков необходимо соблюдать следующие правила:
на каждом шаге со стержня на стержень переносить только один диск;
диск нельзя помещать на диск меньшего размера;
для промежуточного хранения можно использовать стержень В.
Реализовать алгоритм, используя три стека вместо стержней А, В, С. Информация о дисках хранится в исходном файле.
Выполнение
Реализация cтека на языке программирования java.
public class Stack { private int arr[]; private int top; private int capacity; Stack(int size) { arr = new int[size]; capacity = size; top = -1; } public boolean isEmpty() { return top == -1; } public boolean isFull() { return top == capacity - 1; } public void push(int num) { if(isFull()) { System.out.println("Overflow"); return; } arr[++top] = num; } public int peek() { if(!isEmpty()) return arr[top]; return -1; } public int pop() { if(isEmpty()) { return Integer.MIN_VALUE; } return arr[top--]; } public int size() { return top+1; } }
Код программы
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class MainClass { static Stack A; static Stack B; static Stack C; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("numDisks.txt")); // Для считывания файла int num_of_disks = Integer.parseInt(br.readLine()); // Число дисков Stack A,B,C; // Три стэка(стрежня) A = new Stack(num_of_disks); B = new Stack(num_of_disks); C = new Stack(num_of_disks); Iterative(num_of_disks,A,B,C); } public static void moveDisks(Stack src, Stack dst,char s, char d) { int pole1TopDisk = src.pop(); int pole2TopDisk = dst.pop(); // Если стержень 1 пустой if(pole1TopDisk == Integer.MIN_VALUE) { src.push(pole2TopDisk); moveMessage(d,s,pole2TopDisk); } // Если стежень 2 пустой else if(pole2TopDisk == Integer.MIN_VALUE) { dst.push(pole1TopDisk); moveMessage(s,d,pole1TopDisk); } // если диск 1-го стрежня больше диска 2-го else if(pole1TopDisk > pole2TopDisk) { src.push(pole1TopDisk); src.push(pole2TopDisk); moveMessage(d,s,pole2TopDisk); } // если диск 2-го стрежня больше 1-го else { dst.push(pole2TopDisk); // помещаем сначала больший диск dst.push(pole1TopDisk); // затем меньший диск moveMessage(s,d,pole1TopDisk); } } public static void moveMessage(char fromPeg, char toPeg, int disk) { System.out.println("Move the disk " + disk + " from " + fromPeg +" to " + toPeg ); } public static void Iterative(int num, Stack src, Stack aux, Stack dest) { int i, total_num_of_moves; char s = 'A', d = 'C', a = 'B'; // Если число дисков четное, то меняем результирующий и промежуточный диск if (num % 2 == 0) { char temp = d; d = a; a = temp; } // Минимальное число ходов, чтобы решить ханои равняется 2^n - 1 total_num_of_moves = (int) (Math.pow(2, num) - 1); for (i = num; i >= 1; i--) { // в цикле закладываем на первый стержень диски, сначала с большим числом src.push(i); } for (i = 1; i <= total_num_of_moves; i++) { if (i % 3 == 1) moveDisks(src, dest, s, d); else if (i % 3 == 2) moveDisks(src, aux, s, a); else if (i % 3 == 0) moveDisks(aux, dest, a, d); } } }
Результаты работы
Входные данные (число дисков на стрежне) в файле numDisks.txt
4
Результат работы:
Если воспользоваться любым онлайн сервисом с Ханойской башней, то можно убедиться, что все верно.
Вывод
Я изучил структуру данных стек и понял, как ее реализовать. Данная структура данных является очередью. Таким образом, она позволяет довольно просто реализовать добавление и удаление элементов, которые в свою очередь добавляются поверх остальных, и удаляются, начиная с последнего добавленного.
