ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 19.03.2019

Просмотров: 163

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра математического обеспечения и применения ЭВМ















ОТЧЁТ

по лабораторной работе №3

по дисциплине «АиСД»

Тема: Стеки и очереди









Студент гр. 3303



Преподаватель







Санкт-Петербург

2018


Цель работы:

Изучение стеков и очередей и способов работы с ними.


Задание:

Представьте себе, что четыре железнодорожных вагона находятся на входной стороне пути и перенумерованы соответственно 1, 2, 3, 4. На входе операции над вагонами: вагон N в начало дека; вагон N в конец дека, вагон из начала дека на выход, вагон из конца дека на выход.

Построй программу моделирующую данную ситуацию для N (N < 1000000) вагонов.

В решении задачи использовать дек.

Коды всех функций, слотов, и описания структур находятся в Приложении А.


Ход работы:

В основе дека написана структура данных для элемента дека и самого дека. В основе дека лежит двухсвязный линейный список. Принцип работы дека приведён на рис. 1.

Рисунок 1 – Принцип работы дека

Затем были описаны функции работы со деком:

  • функция для загрузки данных в начало дека void push_deck_head(DECK &deck,int number)

  • функция для загрузки данных в конец дека void push_deck_tail(DECK &deck,int number)

  • функция для выгрузки данных из начала дека int pop_deck_head(DECK &deck)

  • функция для выгрузки данных из конца дека int pop_deck_tail(DECK &deck)

Далее была реализована функция void read_deck(DECK &deck, istringstream &in_stream) для чтения дека с потока.

Далее были описаны слоты – функции, вызываемые при нажатии определённых пунктов меню:

  • слот on_actionInfo_triggered() – вызывается при выборе в меню пункта «Info» и вызывает справку по программе;

  • слот on_actionAbout_Authour_triggered() – вызывается при выборе в меню пункта «Author» и вызвает справку об авторе;

  • слот on_sort_button_clicked() – вызывает загрузку данных в дек и их последующую обработку с выводом результата;

  • слот on_action_triggered ­ вызывает загрузку данных из файла.

Далее был описан класс HelpBrowser в файле helpbrowser.h, в котором содержится лишь описание конструктора, который в переданном по указателю виджете располагает кнопки для переключения между html страницами, и «соединяет» соответствующие сигналы со слотами.

Далее были созданы 5 html файлов, описывающих страницы для виджета HelpBrowser.

Описание работы приложения:

Само приложение представляет из себя окно с текстовым полем QTextEdit для ввода последовательности вагонов, с текстовым полем QTextEdit для вывода отсортированных вагонов и меню вверху окна. В текстовое поле необходимо ввести последовательность вагонов и нажать кнопку «Сортировать». Также последовательность вагонов можно ввести из файла через пункт меню File. Результат будет выведен в текстовом поле. Также в верхнем меню есть пункты Help и Author для просмотра информации о всех функциях программы, задании и её авторе соответственно. При их выборе создастся отдельное окно - QWidget.


Пример работы программы:

На рис. 2-3 приведены примеры работы программы

Рисунок 2 – Пример работы программы

Рисунок 3 – Справка по программе

Вывод:
С помощью функций стандартных библиотек c++ было осуществлено решение поставленной задачи с помощью дека, получены навыки в работе с стеками и списками.



ПРИЛОЖЕНИЕ А

ИСХОДНЫЙ КОД ПРОГРАММЫ

Mainwindow.cpp:

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include "HelpBrowser.h"

#include <QMessageBox>

#include <iostream>

#include <sstream>

#include <cstdlib>

#include <fstream>


using namespace std ;


MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

}


MainWindow::~MainWindow()

{

delete ui;

}


void MainWindow::on_actionInfo_triggered()

{

HelpBrowser *helpBrowser = new HelpBrowser(":/", "index.htm");


helpBrowser->resize(400, 300);

helpBrowser->show();

}

void MainWindow::on_actionAbout_Authour_triggered()

{

HelpAuthor *helpAuthor = new HelpAuthor(":/", "author.htm");


helpAuthor->resize(300, 400);

helpAuthor->show();

}


typedef struct lisp{

int field;

struct lisp *next;

struct lisp *prev;

}lisp;


typedef struct DECK{

lisp* head;

lisp* tail;

int size;

}DECK;


void push_deck_head(DECK &deck,int number){

lisp *temp = new lisp;

if(deck.head != NULL){

temp->field=number;

temp->prev= NULL;

temp->next=deck.head;

deck.head->prev=temp;

deck.head=temp;

}else{

deck.head = temp;

deck.head->field=number;

deck.head->next=NULL;

deck.head->prev=NULL;

deck.tail = deck.head;

}

deck.size++;

}


void push_deck_tail(DECK &deck,int number){

lisp *temp = new lisp;

temp->field=number;

temp->prev= deck.tail;

temp->next=NULL;

deck.tail->next=temp;

deck.tail = temp;

deck.size++;

}


int pop_deck_head(DECK &deck){

int x = deck.head->field;

if(deck.size != 1){

deck.head = deck.head->next;

delete deck.head->prev;

deck.head->prev=NULL;

}else{

delete deck.head;

deck.head =NULL;

deck.tail =NULL;

}

deck.size--;

return x;

}


int pop_deck_tail(DECK &deck){

int x = deck.tail->field;

if(deck.size != 1){

deck.tail = deck.tail->prev;

delete deck.tail->next;

deck.tail->next=NULL;

}else{

delete deck.tail;

deck.head =NULL;

deck.tail =NULL;

}

deck.size--;

return x;

}


void read_deck(DECK &deck, istringstream &in_stream){

char c;

while((c = in_stream.peek()) != '$'){

if(c == '\n' || c == ' ' || c == ',' || c == ';' ){

in_stream.get();


}else{

int x;

in_stream>>x;

push_deck_head(deck,x);

}

}

}


void MainWindow::on_sort_button_clicked(){


DECK deck ={ NULL ,NULL,0 };



QString input_str;

string str = ui->Train_input->toPlainText().toLocal8Bit().data();


str+="$";

istringstream input_string(str);

read_deck(deck,input_string);


if(deck.size>0){

int N = deck.size;

for (int i = 0; i < N/2; i++) {

input_str+=QString::number(pop_deck_head(deck));

input_str+=", ";

input_str+=QString::number(pop_deck_tail(deck));

if(deck.size != 0){

input_str+=", ";

}else{

input_str+=";";

}

}

if( deck.size == 1){

input_str+=QString::number(pop_deck_head(deck));

input_str+=";";

}

}else{

input_str = "NULL";

}


ui->Train_output->setText(input_str);

}


void MainWindow::on_action_triggered(){

QString patch_to_file = QFileDialog::getOpenFileName(this,"Open file", QDir::currentPath(),

"File with date (*.txt);;All files (*.*)");

if(patch_to_file.isEmpty()) return;


QFile file(patch_to_file);

QByteArray data;

if(!file.open(QIODevice::ReadOnly)) return;


data = file.readLine();

ui->Train_input->setText(data);

}



Mainwindow.h:

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicit MainWindow(QWidget *parent = 0);

~MainWindow();

private slots:

void on_actionInfo_triggered();

void on_actionAbout_Authour_triggered();

void on_sort_button_clicked();

void on_action_triggered();

private:

Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H