переделывали в инсте стэк, но я забыл его скачать, сам никак не могу вспомнить, пожалста переделайте ентот пас, чтоб стэк работал для символов, для задачи оч надо на завтра
volvo
25.10.2006 21:46
Если то, что ты выложил, работало с Integer, то вот это будет работать с Char:
kr3v3tkus
25.10.2006 21:53
volvo пасиба большое 3 месяца тут уже небыл, но снова Выручаете мну зы ну я и дефект ;) тут procedure Push(Value:T); procedure Pop(var Value: T); забыл изменить на чар блин ;)))) и думаю - чёж не работает ;)))
kr3v3tkus
25.10.2006 22:32
если можно, то ещё вопросик, просто ваще первый раз за дельфя сел как правильно написать: нужно подсчитать все строки мемо1 до строчки с символом ";" чёто я нагородил тут
Код
while flag = true do if Memo1.Lines.Text(i) <> ";" then inc(f) else flag:=false;
volvo
26.10.2006 0:06
Цитата
до строчки с символом ";"
имеется в виду, что строка содержит ТОЛЬКО ";" или все, что угодно, включая этот символ?
По первому варианту:
i := 0; while (i < memo1.Lines.Count) and (Memo1.Lines[i] <> ';') do inc(i);
по второму:
i := 0; while (i < memo1.Lines.Count) and (pos(';', Memo1.Lines[i]) = 0) do inc(i);
kr3v3tkus
26.10.2006 1:31
По первому Правда всё равно ничё не могу никак сделать с этим стэком ((( Ужасть как фигово иметь препода из другого города, который считает что нас на родине чемуто учат если ещё совсем не надоел , то глобальный вопрос ) - нужно стеком поменять первую половину строк с символами со второй местами, тоесть a c b d c a d b ; На форме 2 мемо и кнопка я ваще какуюто черноту накатал( ето для второй половины)
Код
i:=0; while (i<memo1.Lines.Count)and(Memo1.Lines[i]<>';') do inc(i); q:=(i div 2); if (i mod 2)<>0 then inc(q);
while (q<>0) do begin l.Pop(q); p.Push(q); Memo2.Lines.Add(IntToStr(q)); dec(q); end;
Вот когда мы уже запустили программу и вводим вручную символы, как засунуть их в стэк? мож там на евент Onchange ставить пуш? кароче ваще плыву
мисс_граффити
26.10.2006 1:40
можно и так. но тогда у человека не будет возможности исправить, если что-то не то ввел (или надо проверять - если нажат бэкспейс или делит - удалять элемент). я бы предложила дать возможность ввести все, а потом нажать на кнопку типа "готово".
kr3v3tkus
26.10.2006 1:55
ващето да, ток я ваще тут понапутал всё и поп и пуш ваще через левую какуюто переменную(я по примеру с цифрами смотрел и напутал видать с типами). Эээх пойду спать, завтра бить будут ;))) надо готовиться ;)))
мисс_граффити
26.10.2006 2:48
интересный подход... откуда ж мы можем знать, где и что ты напутал при использовании готовых методов?..
kr3v3tkus
26.10.2006 20:04
А не могли бы Вы на примере показать - программа запущена, в неё введены символы(например 4) и ";", как занести в стек эти 4 символа с помошью вот этого
Код
procedure TStack.Push (Value:Char); var P:PNode; begin new(P); P.Next:=FNode; FNode:=P; P.Info:=Value; end;
если можно, то с варом, а то я просто ужасть как путаюсь с переменными, тем более с использованием этих готовых методов
мисс_граффити
26.10.2006 20:55
не совсем поняла, что ты от меня хочешь.... думаю, примерно этого: первая переменная, которая нам понадобится - это сам стэк.
var Stack : TStack;
Под нее нужно выделить место, то есть сделать
Stack:=TStack.Create;
примерно такое я бы запихнула в обработчик события нажатие на кнопку "все готово":
var ch: char; //символ, с которым будем работать i: integer; //текущая строка begin i:=1; ch:=Memo1.Lines[0][1]; //считываем символ из нулевой строки while ch<>';' do //пока не дошли до конца begin Stack.Push(ch); ch:=Memo1.Lines[i][1]; inc(i); end; end;
Если точки с запятой не будет - получится фигня. Если есть вероятность такого события - добавь проверку, не превышает ли i количество строк в Memo1.
После того, как ты сделал все, что хотел, обязательно очисти память при помощи destroy.
Гость
26.10.2006 23:48
тенк ю буду мучить ща
kr3v3tkus
27.10.2006 0:41
фуф отмучил :D мисс_граффити ууу пасиба терь после наглядного примера усё стало по полкам
Код
q:=0; i:=1; ch:=Memo1.Lines[0][1]; while ch<>';' do begin l.Push(ch); ch:=Memo1.Lines[i][1]; inc(q); inc(i); end;
q:=(i div 2); {howmessage(inttostr(q));}
for i := q+1 to 2*q do begin l.Pop(ch); t.Push(ch); end; for i := q+1 to 2*q do begin t.Pop(ch); p.Push(ch); Memo2.Lines.Add(ch); end; while (not l.Empty) do begin l.Pop(ch); t.Push(ch); end; while (not t.Empty) do begin t.Pop(ch); p.Push(ch); Memo2.Lines.Add(ch); end;
ток пришлося 3 стэка делать, чтоб перевернуть усё это гадство как надо ;))) ща буду ещё очередь отмучивать
мисс_граффити
27.10.2006 1:14
Кошмар какой-то. 3 стэка?! Зачем? надо 2 указателя поменять местами, а не все элементы переставлять!!!! Это ж динамическая структура.
kr3v3tkus
27.10.2006 2:46
эмм 2 указателя? препод на уроке делал вот таким вот перелопачиванием
мисс_граффити
27.10.2006 3:07
извращенцы. ну ради чего это? ладно, дело твое..... но я бы просто переставила указатель Head (начало стэка) на первый элемент второй половины; указатель из поля Next последнего элемента (оно было нуль-указателем) на бывший первый элемент; поле Next последнего элемента первой половины - изменить на нуль-указатель. только ввести доп. указатель, чтобы ничего не потерять. это ведь намного проще, затраты по памяти и времени несравнимы.
kr3v3tkus
27.10.2006 3:38
что извращенцы - так это точна ну просто хоть и второй курс - а специальность у нас наполовину экономическая, поэтому наверна не хотят грузить. На самом деле из 20 с чем то человек хоть что-то понимают человек 10 от силы ;) а насчёт перестановки указателей - крута действительно куча времени и памяти съэкономицца, но я и с этим то путался, да и не поймёт он меня, если после тупняка принести ему такое решение
мисс_граффити
27.10.2006 4:04
оно же и алгоритмически проще ) хочешь, нарисую картинку, чтобы было яснее? думаю, если ты ему покажешь, что сам это дело понимаешь - никаких проблем со сдачей не возникнет. +всегда можно принести два варианта и с наивным взглядом сказать: "мне кажется, это решение красивее...."
ОФФ. У нас специальность абсолютно не экономическая, чистое ПО - из 23 человек первую лабораторку (ну что-то вроде вот этой твоей - у кого стек, у кого очередь, у кого дек), заданную на первой лекции (начало сентября) сделало 5 человек.
kr3v3tkus
27.10.2006 14:09
не, саму теорию я понял, единственное про дополнительный указатель не совсем ... ...а вот как на практике сделать это делать надо не в самом юните, а в тех методах готовых? ЗЫ сила еслиб у нас бы дали прям в аудитории решать чёнить, то я ваще сомневаюсь, чтобы ктото решил + грузят нас чёт по математике, а профилирующие нифига ( програмирование - раз в 2 недели 1-2 пары ()
мисс_граффити
27.10.2006 22:03
в самом модуле, разумеется. вместо твоего "перелопачивания" Head - указатель на начало стека, pt и pt1 - указатели, под которые выделено место, но в него пока ничего не засунуто.
pt:=Head; pt1:=Head; //пролистываем циклом до середины массива, то есть q-1 раз (или q? проверь....) делаем: pt:=pt^.Next; //имеем указатель на первый элемент первой половины и последний элемент первой половины. Head:=pt^.Next; //теперь первым в стеке будет первый элемент второй половины pt^.Next:=nil; //а последний элемент первой половины станет совсем последним pt:=Head; //иначе не сможем листать, т.к. наткнемся на нуль-указатель //пролистываем до конца стека (можешь опять же посчитать, а можешь цикл while), делая pt:=pt^.Next; //для последнего элемента: pt^.Next:=pt1; //теперь он указывает на первый элемент первой половины.
примерно так. не проверяла, но вроде проблем не должно быть..... если интересно - экспериментируй
volvo
27.10.2006 22:25
Цитата
надо 2 указателя поменять местами, а не все элементы переставлять!!!! Это ж динамическая структура.
Юля, у нас, например, за такое можно было и по ушам получить от преподавателя. А знаешь, почему? Потому, что при использовании Стека ты имеешь право пользоваться ТОЛЬКО методами, доступными и применимыми к Стеку. Неважно, что ЭТО проще алгоритмически... В стек по определению можно закинуть элемент, можно вытащить оттуда элемент, и скопировать значение, хранящееся на вершине стека в переменную. ВСЁ... Все остальное - грязный хак, и не приветствуется...
Если исходники ЭТОЙ реализации стека недоступны, а есть только откомпилированный модуль - что будешь делать?
мисс_граффити
27.10.2006 22:30
то есть забываем, как он организован, и вот так вот все перелопачиваем? буду знать.
volvo
27.10.2006 22:56
kr3v3tkus, кстати, по поводу твоей реализации - ты ввел в Memo символы (5 строк, по 3 символа в каждой, кроме последней, включая пробел):
Цитата
a c b d e f g h ;
Что ты хочешь получить в результате? А то ты привел такой пример, что неясно...
Вполне возможно, что можно будет обойтись без трех доп. стеков...
kr3v3tkus
28.10.2006 1:41
да, эт точно быстрее будет буду осмысливать пасибки большое за помощь нубу :D зы ёёё пока афк был тут уже столько написали () volvo чёт я сам не оч понял, я имелл ввиду такое условие : мемо1 - в нём идут такие символы в строках - a,b,c,d, а надо сделать в мемо2 - c,d,a,b или я не про то говорю? и ммм откуда эта цитата то ?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.