
1) Авдеев 2) Кротов 3) Гаврилов 4) Шмелёв
Содержимое файла file5.txt: Антонова
Воротников
Егорова
Колесников
Кузнецов
Павлов
Петрова
Сафонов
Харитонов
Указание. Использовать метод фиктивного элемента.
Задача 14**. Считалочка. N ребят расположены по кругу. (Каждому присвоен номер по порядку). Начав отсчёт от первого, удаляют каждого k-ого, смыкая при этом круг. Определить номер последнего, оставшегося в круге. ( kN )
Тест 1: k=3 N=7 Ответ: 4
Тест 2: k=4 N=11 Ответ: 9
Указание. Для решения задачи использовать очередь, в которой ссылочное поле последнего элемента содержит адрес первого элемента.
21
…
Стек
Однонаправленный список, в котором новый элемент добавляется не в конец, а в начало, впереди предыдущего элемента, называется стек. Элемент, который добавлен в стек последним, называется вершиной стека. С него и начинается обработка элементов стека. Отсюда и обозначение стека – lifo (last in first out – последним пришел, первым ушёл).
Задача 15. Создать стек, информационные поля которого содержат числа из текстового файла file1.txt. Вывести значения информационных полей стека в поле метки. Содержимое файла file1.txt:
14 -9 8 -22 39
-1 -13 0 4 -7
27 5 -2 18 3
Полный текст модуля:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
type link = ^elem;
elem = record
Val : integer;
next : link
end;
var Form1: TForm1; p : link;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var q : link; f : textfile;
begin
assignfile(f, ' file1.txt '); reset(f);
p:=nil;
while not eof(f) do
begin new(q); read(f, q.val); q.next:=p; p:=q end;
closefile(f); showmessage('Стек создан')
end;
procedure TForm1.Button2Click(Sender: TObject);
var q : link;
begin
label1.Caption:='';
q:=p;
while q<>nil do
begin
label1.Caption:=label1.Caption + inttostr(q.val) + ' ';
q:=q.next
end;
end;
end.
Задача 16. Написать программу, проверяющую правильность расстановки круглых скобок в арифметическом выражении.
В процессе работы приложения анализируем символы строки, содержащей арифметическое выражение. Если очередной символ – открывающаяся скобка, то она записывается в стек. Если же это закрывающаяся скобка, то находящаяся в вершине стека открывающаяся скобка из стека удаляется при условии, что стек не пуст. Если же стек пуст, то это означает возникновение ошибки в расстановке скобок. Если же такая ошибка не встретилась и по окончании просмотра символов строки стек пуст, то расстановка скобок в выражении сделана правильно. type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
end;
type link = ^elem;
elem = record
val : char;
next : link
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure in_stack(var p:link; d:char);
var r:link;
begin new(r); r^.val:=d; r^.next:=p; p:=r end;
procedure del_stack(var p:link);
var r:link;
begin r:=p; p:=p^.next; dispose(r) end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer; t:boolean; q:link; s, str : string;
begin
s:=edit1.Text; q:=nil; t:=true; i:=1;
while (i<=length(s)) and t do
begin
if s[i] = ' ( ' then in_stack(q, s[i])
else if s[i] = ' ) ' then
if q<>nil then del_stack(q) else t:=false;
inc(i)
end;
t:=t and (q=nil);
if t then str:=' Правильно ' else str:=' Ошибка '; label1.caption:=str;
end;
end.
Задачи
Задача 17. Преобразовать последовательность действительных чисел, записанных в файле file6.txt, расположив сначала отрицательные числа последовательности, а затем неотрицательные. При этом порядок как отрицательных, так и неотрицательных чисел изменяется на обратный. Для отображения содержимого файла на форме использовать компонент Memo1.
Указание. Для решения задачи создать два стека: с отрицательными и с неотрицательными числами последовательности.
Содержимое файла file6.txt: 19.5 8.06 -43.1 14.9 -35.8
-27.02 0 5.17 62.4 -4.7
Задача 18. Даны целые числа a1, a2, … an (n=20), содержащиеся в текстовом файле file7.txt. Вычислить значение выражения
p1 10 + p2 100 + p3 1000 + … ,
где p1, p2 , p3 , … – встречающиеся в последовательности положительные числа, взятые в обратном порядке (начиная с последнего встретившегося положительного числа). Содержимое файла file7.txt:
5 -26 8 -12 19
-10 -13 0 4 -7
9 1 -2 18 -63
Указание. Для решения задачи сформировать стек из положительных чисел последовательности.
Задача 19**. Написать программу для вычисления значения выражения, представленного в обратной польской записи.
Обычная запись Обратная польская запись
(b + c) d b c + d
a + (b + c) d a b c + d +
(6 + 8)/2 + 11 6 8 + 2 / 11 +
Указание. Просматривая строку, в которой записано выражение, анализируем очередной символ. Если это число, то записываем его в стек. Если это знак операции, то достаём два элемента из стека, выполняем арифметическую операцию, определяемую этим знаком, и заносим результат в стек.