Помощь - Поиск - Пользователи - Календарь
Полная версия: Стек.
Форум «Всё о Паскале» > 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" - я не вижу. Объяснишь? Где симметрия?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.