ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 19.03.2019
Просмотров: 163
Скачиваний: 1
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра математического обеспечения и применения ЭВМ
ОТЧЁТ
по лабораторной работе №3
по дисциплине «АиСД»
Тема: Стеки и очереди
Студент гр. 3303 |
|
|
Преподаватель |
|
|
Санкт-Петербург
Цель работы:
Изучение стеков и очередей и способов работы с ними.
Представьте себе, что четыре железнодорожных вагона находятся на входной стороне пути и перенумерованы соответственно 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++ было осуществлено решение поставленной
задачи с помощью дека, получены навыки
в работе с стеками и списками.
ПРИЛОЖЕНИЕ А
#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
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