ПЕРОВА САБАЕВА
.pdf11.3. Стеки
Стек – это связный список, закон построения которого следующий: новый элемент всегда ставится в начало списка, удаление элемента также происходит из его начала [4, 32]. Место, куда помещаются и из которого извлекаются элементы стека, называется вершиной. Таким образом, стек является структурой данных, которые организованы по принципу LIFO (Last In, First Out) –
«Последний пришел – первый вышел».
Стек можно реализовать различными способами. Например, элементы стека можно разместить в массиве, либо реализовать стек в виде односвязного списка [32]. Рассмотрим реализацию стека в виде списка. В этом случае объекты стека имеют такую же структуру, как и объекты однонаправленного списка. Часть полей описывает характеристику конкретного объекта и есть поле типа указатель, которое содержит адрес следующего в стеке элемента.
Листинг 11.3. В программе создается стек для проверки правильности расстановок скобок в тексте, содержащимся в файле «input.txt » (рис. 11.7). Будем считать, что есть скобки трех видов – круглые, квадратные и фигурные.
Последовательность скобок считается правильной если [4]:
1.Это элементарная последовательность: (), {}, []
2.Пусть S – это правильно построенная последовательность. Тогда последовательности (S), {S} и [S] – правильно построенные.
3.Пусть S и R правильно построенные последовательности. Тогда по-
следовательность SR – правильно построенная.
Алгоритм проверки правильности расстановок скобок заключается в следующем. Если текущий символ является открывающей скобкой, то он заносится в стек. Если текущий символ – закрывающая скобка, то анализируется символ, находящийся в вершине стека. Если это парная скобка, то символ удаляется из стека, а если непарная, то дается информация, что последовательность построена неправильно. Остальные символы игнорируются. В конце анализируется содержимое стека. Если он пуст, то последовательность правильно построена, иначе она построена неправильно.
113
Содержимое файла “input.txt”
Рис. 11.8. Информация, находящаяся в файле «input.txt»
//L11_3.cpp |
|
#include <fstream> |
|
#include <iostream> |
|
using namespace std; |
|
struct stek |
|
{ |
|
char c; |
|
stek*next; |
|
}; |
|
stek* add_stek(stek*, char); |
//Прототип функции добавления элемета в стек |
stek* del_stek(stek*); |
//Прототип функции удаления элемета из стека |
int main( )
{
char nc[3]={'(','{','['}, kc[3]={')','}',']'}, c; int i;
setlocale(LC_CTYPE,"russian"); stek *top=NULL;
ifstream ff("input.txt"); c=ff.get(); while(!ff.eof())
{
for(i=0;i<3;i++)
if(c==nc[i])
{
top=add_stek(top, c);
114
break;
}
for(i=0; i<3; i++)
{
if(c==kc[i])
break;
}
if(i<3 && top!=NULL)
{
if(top->c==nc[i]) top=del_stek(top);
else
{
if(top->c!=nc[i])
{
cout<<"Последовательность построена неправильно\n"; return 0;
}
}
}
else
if(i<3 && top==NULL)
{
cout<<"Последовательность построена неправильно\n"; return 0;
}
c=ff.get();
}
ff.close();
if(top!=NULL)
cout<<"Последовательность построена неправильно\n";
else
cout<<"Последовательность построена правильно\n"; return 0;
}
stek* add_stek(stek *top, char c)
{
stek *new_el; new_el=new stek; new_el->c=c; new_el->next=NULL; if(top==NULL)
top=new_el;
else
115
{
new_el->next=top; top=new_el;
}
return top;
}
stek* del_stek(stek *top)
{
stek *tmp; tmp=top; top=top->next; delete tmp; return top;
}
Результат выполнения программы листинга 11.3 приведен на рис. 11.9.
Рис. 11.9. Результат работы программы листинга 11.3
Листинг 11.4. В программе создаются структуры очереди и стека, хранящие символ. В файле «input.txt» хранится текст (рис. 11.10). Преобразовать его следующим образом: сначала должны идти цифры в том порядке, в котором они встречаются в файле «input.txt», а затем латинские буквы в обратном порядке, чем в файле «input.txt». Для решения этой задачи считываемые цифры следует помещать в очередь, а латинские буквы в стек. Далее необходимо извлечь информацию из очереди, а затем из стека.
Содержимое файла “input.txt”
Рис. 11.10. Информация, находящаяся в файле «input.txt»
//L11_4.cpp
#include <fstream> #include <iostream> using namespace std; struct ochered
116
{
char c; |
|
ochered *next; |
//Указатель на следующий элемент |
}; //Прототип функции постановки в очередь:
void add_ochered(ochered **begin, ochered **end, char nc); //Прототип функции удаления из очереди:
void del_ochered(ochered **begin, ochered **end); struct stek
{
char c; |
|
stek *next; |
//Указатель на следующий элемент |
}; //Прототип функции постановки в стек:
stek* add_stek(stek *top, char nc); //Прототип функции удаления из стека: stek* del_stek(stek*);
//Прототип функции печати содержимого очереди: void print_och(ochered *begin, char *sn);
//Прототип функции печати содержимого стека: void print_stek(stek *top, char *sn);
void add_ochered(ochered **begin, ochered **end, char nc)
{
ochered *new_el;
new_el=new ochered; //Создание нового элемента
(*new_el).c=nc; (*new_el).next=NULL;
if(*begin==NULL) //Очередь пуста.Элемент вносится как единственный
{
(*begin)=(*end)=new_el; return;
}
//Внесение нового элемента в очередь:
(**end).next=new_el; (*end)=new_el;
}
void del_ochered(ochered **begin, ochered **end)
{
ochered *ptr; |
|
ptr=*begin; |
|
if(*begin==NULL) |
//Очередь пуста |
{
cout<<"Очередь пуста";
117
return;
}
//Передвигается начало очереди:
(*begin)=(**begin).next;
//Освобождается память, выделенная для удаляемого элемента: delete ptr;
}
void print_och(ochered *begin, char *sn)
{
ofstream ff(sn); ochered *ptr=begin; while(ptr!=NULL)
{
ff<<(*ptr).c; ptr=(*ptr).next;
}
}
stek* add_stek(stek *top, char c)
{
stek* new_el;
new_el=new stek; |
//Создание нового элемента |
new_el->c=c; |
|
new_el->next=NULL; |
|
if(top==NULL) |
//Стек пуст.Элемент вносится как единственный |
top=new_el;
else
{
//Внесение нового элемента в стек: new_el->next=top; top=new_el;
}
return top;
}
stek*del_stek(stek *top)
{
stek *tmp; tmp=top;
if(top==NULL) //Стек пуст
{
cout<<"Стек пуст"; return NULL;
118
}
//Передвигается начало стека: top=top->next;
//Освобождается память, выделенная для удаляемого элемента: delete tmp;
return top;
}
void print_stek(stek *top, char *sn)
{
ofstream ff(sn,ios::app); stek *ptr=top; while(ptr!=NULL)
{
ff<<(*ptr).c; ptr=(*ptr).next;
}
}
int main( )
{
ifstream ff("input.txt"); char cc[81];
int i;
ochered *begin,*end; stek *top; begin=end=NULL; top=NULL; ff.getline(cc, 80); while(!ff.eof())
{
for(i=0; cc[i]!='\0'; i++)
{
if(cc[i]>='A' && cc[i]<='z') top=add_stek(top, cc[i]);
else
if(cc[i]>='0'&&cc[i]<='9') add_ochered(&begin, &end, cc[i]);
}
ff.getline(cc, 80);
}
ff.close();
char so[8]="out.txt"; print_och(begin, so); print_stek(top, so);
119
return 0;
}
Результат выполнения программы листинга 11.4 приведен на рис. 11.11.
Рис. 11.11. Результат работы программы листинга 11.4
УПРАЖНЕНИЯ
26.В файле “input.txt” задан текст. Ввести структуру, отражающую уникальное слово и частоту его встречаемости в тексте. Создать очередь, элементы которой тип введенной структуры. Результат записать в файл.
27.В файле “input.txt” задан текст. Ввести структуру, отражающую уникальное слово и частоту его встречаемости в тексте. Создать односвязный список, содержащий слова в алфавитном порядке, и результаты записать в файл.
28.В файле “input.txt” задана последовательность чисел и символов арифметических операций (+, -, *, /). Если из файла считывается число, то оно помещается в стек. Если считывается символ, то из стека извлекаются два числа и над ними производится данная арифметическая операция (если она допустима), и результат вновь помещается в стек. Если операцию по каким-либо причинам выполнить невозможно (не хватает чисел в стеке или делитель равен нулю), то на экран выдается сообщение о причине и необходимо прекратить выполнение программы. Если чтение из файла “input.txt” заканчивается успешно, то выдать информацию о количестве проведенных операций.
29.В файле “input.txt” задан список абитуриентов ННГУ с указанием фамилии, имени и отчества, а также суммы баллов, набранных по профильным предметам. Составить односвязный список абитуриентов по убыванию суммы баллов и результаты записать в файл.
30.В файле “input.txt” задан список сотрудников фирмы с указанием даты их поступления на работу. Для описания дат создать структуру. Написать функцию сравнения двух дат. Составить односвязный список сотрудников в порядке возрастания даты их поступления на работу.
31.Для описания дат создать структуру и написать функцию сравнения двух дат. Разработать структуру для описания интервала, состоящего из двух дат. В файле “input.txt” задан список из нескольких пар дат – концов интервала. Составить из них очередь. Определить, существует ли непустое пересечение этих интервалов.
120
32.В файле “input.txt” задан список студентов ММФ ННГУ с указанием фамилии, имени и отчества, а также название предмета и экзаменационная оценка. Составить односвязный список студентов в алфавитном порядке с указанием среднего балла.
33.Создать структуру для описания комплексных чисел. Написать функции действий с комплексными числами (сложение, вычитание, умножение, деление, нахождение модуля). В файле “input.txt” задан список из четного числа комплексных чисел. Для каждой пары комплексных чисел выполнить все четыре арифметических действия и результат записать в файл. Если действия выполнить нельзя, вывести об этом сообщение.
34.В файле “input.txt” задан список заданий для выполнения на ЭВМ. Задание включает: номер задания, длительность выполнения (в минутах) и фамилию исполнителя. Разработать структуру заданий. Создать из заданного списка очередь на выполнение работ. Определить общее время работы в часах и минутах.
35.В файле “input.txt” задан список заданий для выполнения на ЭВМ. Задание включает: номер задания, длительность выполнения (в минутах) и фамилию исполнителя. Разработать структуру заданий. Создать односвязный список по убыванию длительности выполнения задания. Полученные данные записать в файл.
36.Для описания дат создать структуру и написать функцию проверки правильности вводимой даты. В файле “input.txt” задан список дат. При чтении из файла отмечать неправильно записанные даты и заносить их в стек. Определить число неправильно введенных дат и вывести на экран.
37.Для описания дат создать структуру и написать функцию проверки правильности вводимой даты. В файле “input.txt” задан список дат. При чтении из файла игнорировать неправильно записанные даты. Правильно записанные даты заносить в очередь. Определить число правильно введенных дат и вывести на экран.
38. Для описания дат создать структуру и написать функции: проверки правильности вводимой даты и сравнения двух дат. В файле “input.txt” задан список дат. При чтении из файла игнорировать неправильно записанные даты, а из правильно записанных дат создать односвязный список по возрастанию дат. Определить число неправильно введенных дат и вывести на экран.
39.Создать структуру очереди, хранящую символ. В файле «input.txt” задан текст. Преобразовать его следующим образом: сначала должны идти цифры в том порядке, в котором они встречаются в файле ”input.txt”, а затем буквы кириллицы в том же порядке, в котором они встречаются в файле ”input.txt”.
40.Создать структуры очереди и стека, хранящие символ. В файле ”input.txt” задан текст. Преобразовать его следующим образом: сначала должны идти латинские буквы в том же порядке, в котором они встречаются в файле ”input.txt”, а затем цифры в обратном порядке, чем в файле ”input.txt”.
121
41.Создать структуры очереди и стека, хранящие символ. В файле ”input.txt” хранится текст. Преобразовать его следующим образом: сначала должны идти знаки препинания (, . ; : ! -) в том порядке, в котором они встречаются в файле ”input.txt”, а затем буквы кириллицы в обратном порядке, чем в файле ”input.txt”.
42.Создать структуры очереди и стека, хранящие символ. В файле ”input.txt” задан текст. Преобразовать его следующим образом: сначала должны идти латинские буквы в том порядке, в котором они встречаются в файле ”input.txt”, а затем буквы кириллицы в обратном порядке, чем в файле
”input.txt”.
43.Создать структуру для описания моментов времени (часы, минуты, секунды). Написать функцию сравнения двух моментов времени. Разработать структуру для описания участников олимпиады. В файле ”input.txt” задан список участников, содержащий фамилию, имя, отчество и показанный результат. Составить односвязный список по возрастанию показанных результатов и распечатать информацию о первых шести участниках.
44.Создать структуру для описания моментов времени (часы, минуты, секунды). Написать функцию сравнения двух моментов времени. Разработать структуру для описания участников олимпиады. В файле ”input.txt” задан список участников, содержащий фамилию, имя, отчество и показанный результат. Составить односвязный список по убыванию показанных результатов и распечатать информацию о первых шести участниках.
45.Для описания дат создать структуру и написать функцию, определяющую расстояние в днях между двумя датами. В файле “input.txt” задан список фирм с указанием даты их основания. Составить односвязный список фирм в а порядке возрастания длительности их работы на текущую дату.
46.Для описания дат создать структуру и написать функцию, определяющую расстояние в днях между двумя датами. В файле “input.txt” задан список сотрудников фирмы с указанием начала их контракта и даты его окончания. Составить односвязный список сотрудников в алфавитном порядке с указанием числа дней работы в данной фирме.
47.Для описания дат создать структуру и написать функцию сравнения двух дат. Ввести структуру для описания интервала, состоящего из двух дат. В файле “input.txt” задан список сотрудников фирмы с указанием дат начала и конца их командировки, а также города, куда они были направлены. Определить, какие из сотрудников могут встретиться в командировке, и создать очередь из этих сотрудников.
48.Для описания дат создать структуру и написать функцию сравнения двух дат. В файле “input.txt” задан список продуктов, хранящихся на базе, с указанием срока годности. Создать очередь из продуктов, срок годности которых истек на данную дату. Вывести на экран список продуктов, годных к реализации.
122