- •Нижегородский государственный университет им. Н.И. Лобачевского
- •Оглавление
- •Предисловие
- •Глава 1. Вычисление значений функций
- •1.1. Операторы циклов
- •1.2. Операторы ветвления
- •Когда в программе нужно выбрать один из многочисленных вариантов, бывает целесообразным применять оператор-переключатель switch. Этот оператор называется ещё оператором множественного выбора [1].
- •Switch (выражение)
- •1.3. Алгоритмы, необходимые для написания программ
- •Глава 2. Суммирование рядов
- •Глава 3. Позиционная запись числа
- •Глава 4. Делители целого числа
- •5.1. Сортировка вставкой
- •5.2. Метод пузырька
- •5.3. Сортировка выбором
- •5.4. Быстрая сортировка
- •Глава 6. Работа с файлами. Построение массивов без повторений
- •6.1. Работа с файлами
- •6.2. Построение массивов без повторений
- •Глава 7. Обработка последовательности символов
- •7.1. Алгоритм выделения слова из строки
- •7.2. Выбор слов, подходящих под шаблон
- •7.3. Перевод прописных символов в строчные
- •Глава 8. Побитовые операции
- •Глава 9. Преобразование и построение матриц
- •Содержимое файла “input.Txt”
- •Глава 10. Структуры
- •Выделение памяти под объект coat
- •Содержимое файла "input.Txt".
- •Содержимое файла "outout.Txt"
- •Содержимое файла "input.Txt"
- •11. Динамические структуры данных
- •11.1. Односвязные списки
- •11.2. Очереди
- •11.3. Стеки
- •Содержимое файла “input.Txt”
- •Содержимое файла “input.Txt”
- •Список литературы
11.3. Стеки
Стек – это связный список, закон построения которого следующий: новый элемент всегда ставится в начало списка, удаление элемента также происходит из его начала [4, 32]. Место, куда помещаются и из которого извлекаются элементы стека, называется вершиной. Таким образом, стек является структурой данных, которые организованы по принципу LIFO (Last In, First Out) – «Последний пришел – первый вышел».
Стек можно реализовать различными способами. Например, элементы стека можно разместить в массиве, либо реализовать стек в виде односвязного списка [32]. Рассмотрим реализацию стека в виде списка. В этом случае объекты стека имеют такую же структуру, как и объекты однонаправленного списка. Часть полей описывает характеристику конкретного объекта и есть поле типа указатель, которое содержит адрес следующего в стеке элемента.
Листинг 11.3. В программе создается стек для проверки правильности расстановок скобок в тексте, содержащимся в файле «input.txt » (рис. 11.7). Будем считать, что есть скобки трех видов – круглые, квадратные и фигурные.
Последовательность скобок считается правильной если [4]:
Это элементарная последовательность: (), {}, []
Пусть S – это правильно построенная последовательность. Тогда последовательности (S), {S} и [S] – правильно построенные.
Пусть S и R правильно построенные последовательности. Тогда последовательность SR – правильно построенная.
Алгоритм проверки правильности расстановок скобок заключается в следующем. Если текущий символ является открывающей скобкой, то он заносится в стек. Если текущий символ – закрывающая скобка, то анализируется символ, находящийся в вершине стека. Если это парная скобка, то символ удаляется из стека, а если непарная, то дается информация, что последовательность построена неправильно. Остальные символы игнорируются. В конце анализируется содержимое стека. Если он пуст, то последовательность правильно построена, иначе она построена неправильно.
Содержимое файла “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);
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
{
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». Для решения этой задачи считываемые цифры следует помещать в очередь, а латинские буквы в стек. Далее необходимо извлечь информацию из очереди, а затем из стека.