Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 32
1

Работа со стеком и очередью

24.09.2014, 16:46. Просмотров 1221. Ответов 7
Метки нет (Все метки)

Вот такое вот задание:
Система состоит из процессора P, трёх очередей F0, F1, F2 и стека S. В систему поступают запросы на выполнение задач.Поступающие запросы ставятся в соответствующие приоритетам очереди. Сначала обрабатываются задачи из очереди F0. Если она пуста, можно обрабатывать задачи из очереди F1. Если и она пуста, то можно обрабатывать задачи из очереди F2. Если все очереди пусты, то система находится в ожидании поступающих задач (процессор свободен), либо в режиме обработки предыдущей задачи (процессор занят). Если поступает задача с более высоким приоритетом, чем обрабатываемая в данный момент, то обрабатываемая помещается в стек и может обрабатываться тогда и только тогда, когда все очереди пусты.
При чем стек является статическим, а очередь динамической. Имя задачи, длительность выполнения, момент поступления и приоритет записаны в виде таблицы в файле.
Теоретически понимаю, как проходит работа со стеком и очередью, но реализовать не представляю как. ООП использовать нельзя.
Нужна помощь, друзья
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2014, 16:46
Ответы с готовыми решениями:

Прокомментировать код, работающий с очередью и стеком
Доброго времени суток. Есть код, работающий с очередью и стеком. Я не могу понять как он работает,...

Реализовать абстрактный класс "Список" стеком/очередью
Доброго времени суток, форумчане! Нужно реализовать абстрактный класс " Список " и выполнить две...

Нужны задачки для упражнения в работе со списком, стеком, очередью и двусвязным списком
Недавно научился строить список, стек, очередь, двусвязный список в С++, что бы закрепить навыки...

Работа с очередью
Как сделать так, чтобы очередь выводила после нуля, 3 случайных числа. Написал программу но числа...

7
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
24.09.2014, 17:07 2

Не по теме:

Цитата Сообщение от greg177 Посмотреть сообщение
ООП использовать нельзя.
Что за задания такие пошли: то нельзя, это нельзя? Может, вообще сразу в машинных кодах писать, что уж там...


По теме: очередь - первым вошёл, первым вышел. Стек - первым вошёл, последним вышел.
Структуры по-любому придётся использовать.
Элемент очереди:
C++
1
2
3
4
5
6
7
8
9
struct Task {};
struct QueueElement
{
    Task value;
    QueueElement * next;
    QueueElement(Task t) : value(t), next(NULL) {}
};
QueueElement * F0Head; // указывает на начало очереди
QueueElement * F0Tail; // указывает на посл.элемент очереди
Когда поступит первый Task, создаёшь F0Head = new QueueElement(task); F0Tail = F0Head. Как только поступает новый Task, создаёшь новый элемент очереди (по new, раз очереди динамические), в F0Tail правишь указатель next на этот элемент, а сам F0Tail устанавливаешь равным новому созданному элементу.
Для начала так.
0
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 32
24.09.2014, 17:26  [ТС] 3
John Prick, как вообще считывать из файла задачу и ее характеристики? Как массив структур?
0
Форумчанин
Эксперт CЭксперт С++
8160 / 5008 / 1436
Регистрация: 29.11.2010
Сообщений: 13,458
24.09.2014, 17:55 4
Цитата Сообщение от greg177 Посмотреть сообщение
Как массив структур?
Цитата Сообщение от greg177 Посмотреть сообщение
ООП использовать нельзя.
В массивы.

Не по теме:

шёл 2014 год..

0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
24.09.2014, 21:40 5
Цитата Сообщение от greg177 Посмотреть сообщение
как вообще считывать из файла задачу и ее характеристики? Как массив структур?
Как захочешь, так и будет.
Давай определимся, какие у задачи есть характеристики.
0
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 32
24.09.2014, 22:46  [ТС] 6
John Prick, ну под характеристиками я имел ввиду приоритет, длительность выполнения, имя и момент поступления. Какие есть ещё варианты, кроме массива структур?
0
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
25.09.2014, 10:38 7
Цитата Сообщение от greg177 Посмотреть сообщение
Какие есть ещё варианты, кроме массива структур?
Ну много чего можно придумать, но раз нельзя классы, то да - массив структур.
C++
1
2
3
4
5
6
7
struct Task
{
    int priority;
    int duration;
    char * name;
    int start_time;
};
В файле расположи всё построчно:
Код
1 15 Task1 0
2 10 Task2 3
1 25 Task3 10
В программе читаем это так (честно говоря, я даже не знаю, как работать с файлами без fstream, поэтому сделаю с ним):
C++
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
const int max_tasks = 100;
Task tasks[max_tasks];
int size_tasks = 0;
 
const char * pass_spaces(const char * in)
{
    while (in && (*in == ' '))
        ++in;
    return in;
}
 
const char * pass_not_spaces(const char * in)
{
    while (in && (*in != '\0') && (*in != ' '))
        ++in;
    return in;
}
 
// ...
    std::ifstream input("input.txt");
    if (input.is_open())
    {
        while (!input.eof())
        {
            char str[100];
            input.getline(str, 100);
 
            // приоритет
            const char * pstr = pass_spaces(str);
            tasks[size_tasks].priority = atoi(pstr);
            // длительность
            pstr = pass_not_spaces(pstr);
            pstr = pass_spaces(pstr);
            tasks[size_tasks].duration = atoi(pstr);
            // имя
            pstr = pass_not_spaces(pstr);
            pstr = pass_spaces(pstr);
            const char * end_name = pass_not_spaces(pstr);
            tasks[size_tasks].name = new char[end_name - pstr + 1];
            strncpy(tasks[size_tasks].name, pstr, end_name - pstr);
            tasks[size_tasks].name[end_name - pstr] = '\0';
            // момент поступления
            pstr = end_name;
            pstr = pass_spaces(pstr);
            tasks[size_tasks].start_time = atoi(pstr);
 
            ++size_tasks;
        }
        input.close();
    }
// ...
Потом, в конце работы не забыть удалить выделенную память:
C++
1
2
3
4
5
    while (size_tasks)
    {
        --size_tasks;
        delete tasks[size_tasks].name;
    }
0
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 32
28.09.2014, 17:06  [ТС] 8
Вот так вот реализовал
C++
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <iostream>
#include <cstring>
#include <fstream>
#include <string>
 
using namespace std;
 
struct Node{
    bool state; // текущее состояние
    int item;   // элемент очереди
    Node *next; // указатель на следующий элемент
};
 
enum TASK_TYPE { PUSH_BACK, POP_FRONT };
 
const int STACK_SIZE = 3;
 
int currentTime = 0;
 
int stackSize = 0;
 
int currentPriorityRun = -1;
 
bool processortState = true;
 
Node *queue[STACK_SIZE];
 
int stack[STACK_SIZE];
 
Node* push_backQueue(Node *head, int elem){
    Node *ptr = new Node;
    ptr->item = elem;
    ptr->next = 0;
    
    if (head == 0){
        head = ptr;
        return head;
    }
 
    
    Node *temp = head;
    while (temp->next != 0)
        temp = temp->next;
    temp->next = ptr;
    
    return head;
}
 
 
Node* pop_frontQueue(Node *head){
    
    if (head->next){
        Node *ptr = head->next;
        delete head;
        return ptr;
    }
    return head;
}
 
void pushStack(int *a, int &n, int elem){
    a[n++] = elem;
}
 
void popStack(int *a, int &n){
    if (n - 1 >= 0)
        a[--n] = -1;
}
 
void printQueue(Node *head){
    Node *ptr = head;
    while (ptr){
        cout << ptr->item << " ";
        ptr = ptr->next;
    }
    cout << endl;
}
 
void printAllQueue(Node **arr){
    cout << "\n=====================================================\n";
    for (int i = 0; i < STACK_SIZE; ++i)
    {
        cout << i << " queue: ";
        printQueue(arr[i]);
    }
    cout << "=====================================================\n";
}
 
Node* runTask(Node *head, int timeSec, TASK_TYPE type){
    Node *ptr = head;
    for (int i = 0; i < timeSec; ++i){
        switch (type){
        case PUSH_BACK: ptr = push_backQueue(ptr, i + 1); break;
        case POP_FRONT: ptr = pop_frontQueue(ptr); break;
        }
        currentTime++;
    }
    return ptr;
}
 
 
// читаем файл вида
/*
push 0 5 10
pop 1 2 12
push 1 2 17
push 0 3 41
pop 0 2 45
pop 2 2 51
push 2 11 53
push 1 32 123
pop 0 2 134
push 1 3 150
*/
void readTaskFile(ifstream &f){
    string task;
    int priority, runTime, startTime;
    while (f >> task >> priority >> runTime >> startTime){
        cout << task << " " << priority << " " << runTime << " " << startTime << endl;
        if (processortState == true){
            TASK_TYPE type;
            if (task == "push")
                type = PUSH_BACK;
            else if (task == "pop")
                type = POP_FRONT;
 
 
            if (queue[priority]->state == false){
                pushStack(stack, stackSize, priority);
                processortState = false;
            }
            queue[priority]->state = false;
            queue[priority] = runTask(queue[priority], runTime, type);
            queue[priority]->state = true;
            printAllQueue(queue);
        }
    }
}
 
int main(){
    setlocale(LC_ALL, "rus");
 
    for (int i = 0; i < STACK_SIZE; ++i){
        queue[i] = new Node;
        queue[i]->state = true;
    }
 
 
    ifstream TEXT;
    TEXT.open("C:\\путь\\text.txt", ios_base::in);
    if (TEXT){
        cout << "Файл успешно открыт! " << endl;
        readTaskFile(TEXT);
    }
    else
        cout << "Ошибка при открытии исходного файла!\n";
 
    system("pause");
    return 0;
}
Но после запуска записывается только первая строчка из файла, и останавливается вот здесь
C++
1
2
3
    while (temp->next != 0)
        temp = temp->next;
    temp->next = ptr;
В чем ошибка и как ее исправить?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2014, 17:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

работа с очередью
Нужно создать динамическую структуру очередь и найти определённое условие, мне вот выдаёт ошибку в...

Работа с очередью, список
Ребята, спасайте! обычно я прихожу сюда с недоделанным кодом/кодом в котором что-то неправильно...

Работа со стеком
Задача: Написать программу которая создает стек целых чисел считываемых из файла и удаляет из него...

Работа со СТЕКОМ!!!!!!:)
Создать класс для работы со стеком. Элемент стека – символ. --- Сформировать два стека,содержащие...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.