Помощь - Поиск - Пользователи - Календарь
Полная версия: Стек.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Zorka
главная программа точно неверная..но как не разбиралась...не знаю как её написать((

Условие задачки:
При помощи стэка проверить действительно ли строка символов симметрична относительно середины. Признак середины - цифра 0.


вот то, что сама пыталась написать:
program lab13;
zv=^pointer;
pointer=record
elem: char;
next: zv
end;
var
k,sym: char;
s: zv;
b: boolean;
procedure vstek(var st: zv; buk: char);
var Q: zv;
begin
new(Q);
Q^.elem:=buk;
Q^.next:=st;
st:=Q
end;
procedure vdstek(var st: zv; var A: char; var L: boolean);
var Q: zv;
begin
l:=true;
if st=nil then L:=false
else
begin
A:=st^.elem;
Q:=st;
st:=st^.next;
dispose(Q);
end
end;
begin {golovna programa}
s:=nil;
writeln('vvedu sumvolu');
read(sym);
vstek(s,sym);
b:=true;
while (sym<>'.') and b do
begin
if sym='0' then vdstek(s,k,b);
read(sym);
end;
if (S=nil) and b then
writeln('rjadok sumetruchnuj')
else
writeln('ne sum');
end.


Гость
ну помогииите...плс
IUnknown
Для начала чуть-чуть поправим реализацию стека:

type
pstack = ^stack; { Не надо Pointer-ов, в Паскале есть более типизированные указатели }
stack =
record
elem : char;
next : pstack;
end;


{ Заталкивание в стек всегда называлось Push }
procedure push (var st : pstack; ch : char);
var Q : pstack;
begin
new (Q);
Q^.elem := ch;
Q^.next := st;
st := Q
end;

{
А выталкивание из него - Pop. Причем обрати внимание: это функция, которая
возвращает результат. Было что-то в стеке - значит True, не было - значит, False
}
function pop (var st: pstack; var ch : char) : boolean;
var Q : pstack;
begin
pop := true;

if st = nil then pop := false
else
begin
ch := st^.elem;
Q := st;
st := st^.next;
dispose(Q);
end
end;


А вот теперь с этим стеком уже можно решать поставленную задачу. Есть 2 способа...
1) Прочитать одним циклом символы до '0', записывая их в стек, а потом вторым циклом читать оставшиеся и сравнивать с тем, что было записано ранее.

var
k, sym: char;
s : pstack;
b : boolean;

begin { основная программа }
writeln;
s := nil;
write('s = ');

repeat
read (sym);
push (s, sym);
until sym = '0';

{ Символы до '0' прочитаны, теперь убираем сам '0' с вершины стека }
pop (s, k);

{
... и продолжаем: вторым циклом читаем остальные символы,
выталкивая каждый раз новый символ из ранее запомненных,
до тех пор, пока стек не пуст или пока не найдем несоответствие
}
repeat
b := pop (s, k);
if b then
read (sym);
until (k <> sym) or (not b);

{
Вот когда пришли сюда - есть 2 варианта: либо стек пустой и
строка симметричная - значит, следующий символ, который считается
read-ом, будет признаком конца строки (или точка, или #13: Enter).

Второй вариант - что-то не выполнилось. Либо стек не пустой (значит,
строка не может быть симметричной), либо стек пуст, но в строке есть еще
лишние символы, а не признак конца строки. Например, при вводе '210122.'
последняя двойка - лишняя.

Проверяем пустоту стека и признак конца строки и делаем выводы...
}
read(sym);
if (not b) and (sym = '.') then writeln('Строка симметрична')
else writeln('Нет, что-то не так');
end.


2) сделать всю работу одним циклом.
var
k,sym: char;
s : pstack;
b : boolean;

zero : boolean;

begin {golovna programa}
writeln;
s := nil;
write('s = ');

zero := false; { Был ли уже введен '0' ? }
b := true;
repeat
read (sym);
if sym = '0' then zero := true
else
if zero then
begin
b := pop(s, k);
if b then b := (k = sym);
end
else push (s, sym);
until (sym = '.') or (not b);

if (s = nil) and (sym = '.') then writeln('Строка симметрична')
else writeln('Что-то опять не так...');
end.


Что непонятно - спрашивай...
Zorka
попробуй тут не понять - все так рассписано))
спасибо очень!!!)

но кода запускаю программу, результат неверный(
например, fgh0fgv
строка симметричная, а программа выводит, что нет((
IUnknown
Я, конечно, очень извиняюсь, но симметричная (в моем понимании) строка - это fgh0hgf, например. Или 1230321 (символы расположены симметрично относительно среднего "0" - при проходе от него в любую сторону будет одинаковая последовательность символов).

Что симметричного в строке "fgh0fgv" - я не вижу. Объяснишь? Где симметрия?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.