главная программа точно неверная..но как не разбиралась...не знаю как её написать((
Условие задачки: При помощи стэка проверить действительно ли строка символов симметрична относительно середины. Признак середины - цифра 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.
Гость
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 = 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
16.11.2011 0:08
попробуй тут не понять - все так рассписано)) спасибо очень!!!)
но кода запускаю программу, результат неверный( например, fgh0fgv строка симметричная, а программа выводит, что нет((
IUnknown
16.11.2011 2:55
Я, конечно, очень извиняюсь, но симметричная (в моем понимании) строка - это fgh0hgf, например. Или 1230321 (символы расположены симметрично относительно среднего "0" - при проходе от него в любую сторону будет одинаковая последовательность символов).
Что симметричного в строке "fgh0fgv" - я не вижу. Объяснишь? Где симметрия?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.