Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗадачникПоТПиРнаЭВМ.doc
Скачиваний:
28
Добавлен:
11.03.2016
Размер:
1 Mб
Скачать

11.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 – правильно построенная.

Алгоритм проверки правильности расстановок скобок заключается в следующем. Если текущий символ является открывающей скобкой, то он заносится в стек. Если текущий символ – закрывающая скобка, то анализируется символ, находящийся в вершине стека. Если это парная скобка, то символ удаляется из стека, а если непарная, то дается информация, что последовательность построена неправильно. Остальные символы игнорируются. В конце анализируется содержимое стека. Если он пуст, то последовательность правильно построена, иначе она построена неправильно.

Содержимое файла “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». Для решения этой задачи считываемые цифры следует помещать в очередь, а латинские буквы в стек. Далее необходимо извлечь информацию из очереди, а затем из стека.