1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Стек., начала писать программу, вроде всё правильно, кроме главной программы
главная программа точно неверная..но как не разбиралась...не знаю как её написать((
Условие задачки: При помощи стэка проверить действительно ли строка символов симметрична относительно середины. Признак середины - цифра 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.
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.
Я, конечно, очень извиняюсь, но симметричная (в моем понимании) строка - это fgh0hgf, например. Или 1230321 (символы расположены симметрично относительно среднего "0" - при проходе от него в любую сторону будет одинаковая последовательность символов).
Что симметричного в строке "fgh0fgv" - я не вижу. Объяснишь? Где симметрия?