Форум: "Потрепаться";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];
ВнизHELP! Найти похожие ветки
← →
Driverrr (2002-12-17 20:21) [0]Доброго времени суток!
Мастера, у меня к Вам 2 вопроса:
1) В string строке имеются круглые, квадратные и фигурные скобки. Как проверить, правильно ли они расставлены?
2) Какая формула существует для переведения шестнадцатиричной системы счисления в десятичную?
← →
VictorT (2002-12-17 20:29) [1]1) Используй конечные автоматы (если не ясно, обьясню подробнее).
2) Влом писать, не придумал, как коротко сформулировать, кто-то ответит :)
← →
Anatoly Podgoretsky (2002-12-17 20:42) [2]Открывающую скобку помещать в стек, если встречается закрывающая скобка сравнивать на парность в верхушкой стека, если парная то извлекать из стека, если не парная или сте пуст то ошика, по окончанию сканирования строки стек должен быть пуст, если нет то ошибка не хватает закрывающих скобок
Вот такой простой адгоритм
Второй вопрос с твоей стороны требует расшифровки, но в общем тоже просто, переводим в двоичную форму (StrToInt) затем из двоичной в десятичную (IntToStr) это если речь про текстовое представление чисел, если про другое то уточни.
← →
MsGuns (2002-12-17 20:52) [3]>Anatoly Podgoretsky © (17.12.02 20:42)
А если ")" больше, чем "(" ?
А я бы просто тупо считал и записывал в переменные QPrOpened, QPrClosed, а затем просто if not (QPrOpened=QPrClosed) then ..
По времени то же самое, только никаких тебе стеков (его еще надо на паскале организовать)
← →
Anatoly Podgoretsky (2002-12-17 21:03) [4]Если больше то я указал, при появлении закрывающей скобки проверка на пустоту стека. "или сте пуст то ошика"
В качестве стека удобно использовать обычную строку. Length(S) показывает и на верхушку стека и на количество открывающих скобок. Изначально стек пуст
← →
VictorT (2002-12-17 21:14) [5]
> А я бы просто тупо считал и записывал в переменные QPrOpened,
> QPrClosed, а затем просто if not (QPrOpened=QPrClosed) then
> ..
Ещё проще, просто на открывающююся скобку делаешь инкремент переменной, на закрывающуюся - декремент, а потом сравнение с нулём (это я и имел в виду, когда упомянул конечные автоматы).
← →
Anatoly Podgoretsky (2002-12-17 21:18) [6]VictorT © (17.12.02 21:14)
Так нельзя, вот примеры
(][) ошибка
([)] ошибка
{[]} норма
Это упрощенные примеры
← →
TTCustomDelphiMaster (2002-12-17 21:23) [7]MsGuns
Хорошо тогда для вашего алгоритма я буду ставить скобки так )что то в скобках(.
Если встретишь "(" скобку прибавляй единицу, если ")" отнимай. В конце должен получится 0. Причем число не должно стать отрицательным.
← →
TTCustomDelphiMaster (2002-12-17 21:32) [8]Не заметил что в строке могрут быть разнотипные скобки. Тогда делай как говорит Anatoly Podgoretsky.
← →
Jeer (2002-12-17 22:23) [9]На самом деле вариантов больше, т.к. могут возникать ситуации
[)
(]
и тп
Поэтому имеет смысл составить для Вашей задачи список допустимых
символов открытия и закрытия "скобок".
Проверять можно по разному:))
В конце концов, это действительно конечный автомат.
← →
Ich Hasse (2002-12-17 22:31) [10]1A(h)
1*16^1+10=26 (d)
25B(h)
2*16^2+5*16^1+11=603 (d)
← →
Anatoly Podgoretsky (2002-12-17 22:46) [11]Соответствие простое это парность скобок
При сканировании строки проверяется два сножества, одно для открывающих ["(","[","{"], другое для закрывающих [")","]","}"], спислк дегко может быть расширен и простой case.
Вложенность скобок обеспечивает стек.
ClearStack;
Error := FALSE;
for I := 1 to Length(S) do begin
if S[I] in OpenBrackets then
Push(S[I])
else if S[I] in CloseBrackets then
begin
if StackSize = 0 then
Error := TRUE
else begin
Ch := Pop;
case Ch of
"}": if Ch <> "(" then Error := TRUE;
"]": if Ch <> "[" then Error := TRUE;
"}": if Ch <> "{" then Error := TRUE;
end;
end;
end;
if Error then Break;
end;
Вот здесь в переменной Error результат проверки. Стек проще всего сдалеть с помощью строки;
← →
Anatoly Podgoretsky (2002-12-17 22:51) [12]Пропустил последнюю проверку после последнешл end
if StackSize <> 0 then Error := TRUE;
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.01.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c