главная программа точно неверная..но как не разбиралась...не знаю как её написать((
Условие задачки: При помощи стэка проверить действительно ли строка символов симметрична относительно середины. Признак середины - цифра 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=nilthen L:=false
elsebegin
A:=st^.elem;
Q:=st;
st:=st^.next;
dispose(Q);
endend;
begin{golovna programa}
s:=nil;
writeln('vvedu sumvolu');
read(sym);
vstek(s,sym);
b:=true;
while (sym<>'.') and b dobeginif sym='0'then vdstek(s,k,b);
read(sym);
end;
if (S=nil) and b then
writeln('rjadok sumetruchnuj')
else
writeln('ne sum');
end.
Гость
15.11.2011 3:47
ну помогииите...плс
IUnknown
15.11.2011 16:16
Для начала чуть-чуть поправим реализацию стека:
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 = nilthen pop := false
elsebegin
ch := st^.elem;
Q := st;
st := st^.next;
dispose(Q);
endend;
А вот теперь с этим стеком уже можно решать поставленную задачу. Есть 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
elseif zero thenbegin
b := pop(s, k);
if b then b := (k = sym);
endelse push (s, sym);
until (sym = '.') or (not b);
if (s = nil) and (sym = '.') then writeln('Строка симметрична')
else writeln('Что-то опять не так...');
end.
Что непонятно - спрашивай...
Zorka
16.11.2011 0:08
попробуй тут не понять - все так рассписано)) спасибо очень!!!)
но кода запускаю программу, результат неверный( например, fgh0fgv строка симметричная, а программа выводит, что нет((
IUnknown
16.11.2011 2:55
Я, конечно, очень извиняюсь, но симметричная (в моем понимании) строка - это fgh0hgf, например. Или 1230321 (символы расположены симметрично относительно среднего "0" - при проходе от него в любую сторону будет одинаковая последовательность символов).
Что симметричного в строке "fgh0fgv" - я не вижу. Объяснишь? Где симметрия?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.