Помощь - Поиск - Пользователи - Календарь
Полная версия: стэк для символов
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
kr3v3tkus
переделывали в инсте стэк, но я забыл его скачать, сам никак не могу вспомнить, пожалста переделайте ентот пас, чтоб стэк работал для символов, для задачи оч надо на завтра
volvo
Если то, что ты выложил, работало с Integer, то вот это будет работать с Char:
kr3v3tkus
volvo пасиба большое smile.gif 3 месяца тут уже небыл, но снова Выручаете мну smile.gif
зы ну я и дефект ;) тут
procedure Push(Value:T);
procedure Pop(var Value: T);
забыл изменить на чар блин ;)))) и думаю - чёж не работает ;)))
kr3v3tkus
если можно, то ещё вопросик, просто ваще первый раз за дельфя сел unsure.gif
как правильно написать: нужно подсчитать все строки мемо1 до строчки с символом ";"
чёто я нагородил тут rolleyes.gif
Код
  while flag = true do
    if Memo1.Lines.Text(i) <> ";" then inc(f) else flag:=false;

volvo
Цитата
до строчки с символом ";"
имеется в виду, что строка содержит ТОЛЬКО ";" или все, что угодно, включая этот символ?

По первому варианту:
  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
По первому smile.gif
Правда всё равно ничё не могу никак сделать с этим стэком ((( Ужасть как фигово иметь препода из другого города, который считает что нас на родине чемуто учат blink.gif
если ещё совсем не надоел wacko.gif , то глобальный вопрос sad.gif) - нужно стеком поменять первую половину строк с символами со второй местами, тоесть
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 ставить пуш? sad.gif кароче ваще плыву wacko.gif
мисс_граффити
можно и так.
но тогда у человека не будет возможности исправить, если что-то не то ввел (или надо проверять - если нажат бэкспейс или делит - удалять элемент).
я бы предложила дать возможность ввести все, а потом нажать на кнопку типа "готово".
kr3v3tkus
ващето да, ток я ваще тут понапутал всё и поп и пуш ваще через левую какуюто переменную(я по примеру с цифрами смотрел и напутал видать с типами). Эээх пойду спать, завтра бить будут ;))) надо готовиться ;)))
мисс_граффити
интересный подход...
откуда ж мы можем знать, где и что ты напутал при использовании готовых методов?..
kr3v3tkus
А не могли бы Вы на примере показать - программа запущена, в неё введены символы(например 4) и ";", как занести в стек эти 4 символа с помошью вот этого
Код
procedure TStack.Push (Value:Char);
var P:PNode;
begin
   new(P);
   P.Next:=FNode;
   FNode:=P;
   P.Info:=Value;
end;

если можно, то с варом, а то я просто ужасть как путаюсь с переменными, тем более с использованием этих готовых методов
мисс_граффити
не совсем поняла, что ты от меня хочешь....
думаю, примерно этого:
первая переменная, которая нам понадобится - это сам стэк.
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.
Гость
тенк ю smile.gif буду мучить ща smile.gif
kr3v3tkus
фуф smile.gif отмучил :D
мисс_граффити ууу пасиба smile.gif терь после наглядного примера усё стало по полкам smile.gif
Код
  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 стэка делать, чтоб перевернуть усё это гадство как надо ;)))
ща буду ещё очередь отмучивать smile.gif
мисс_граффити
Кошмар какой-то.
3 стэка?! Зачем?
надо 2 указателя поменять местами, а не все элементы переставлять!!!! Это ж динамическая структура.
kr3v3tkus
эмм 2 указателя? smile.gif препод на уроке делал вот таким вот перелопачиванием unsure.gif
мисс_граффити
извращенцы.
ну ради чего это?
ладно, дело твое.....
но я бы просто переставила указатель Head (начало стэка) на первый элемент второй половины; указатель из поля Next последнего элемента (оно было нуль-указателем) на бывший первый элемент; поле Next последнего элемента первой половины - изменить на нуль-указатель. только ввести доп. указатель, чтобы ничего не потерять.
это ведь намного проще, затраты по памяти и времени несравнимы.
kr3v3tkus
что извращенцы - так это точна wink.gif
ну просто хоть и второй курс - а специальность у нас наполовину экономическая, поэтому наверна не хотят грузить. На самом деле из 20 с чем то человек хоть что-то понимают человек 10 от силы ;)
а насчёт перестановки указателей - крута smile.gif действительно куча времени и памяти съэкономицца, но я и с этим то путался, да и не поймёт он меня, если после тупняка принести ему такое решение lol.gif
мисс_граффити
оно же и алгоритмически проще smile.gif)
хочешь, нарисую картинку, чтобы было яснее?
думаю, если ты ему покажешь, что сам это дело понимаешь - никаких проблем со сдачей не возникнет. +всегда можно принести два варианта и с наивным взглядом сказать: "мне кажется, это решение красивее...."

ОФФ. У нас специальность абсолютно не экономическая, чистое ПО - из 23 человек первую лабораторку (ну что-то вроде вот этой твоей - у кого стек, у кого очередь, у кого дек), заданную на первой лекции (начало сентября) сделало 5 человек.
kr3v3tkus
не, саму теорию я понял, единственное про дополнительный указатель не совсем smile.gif...
...а вот как на практике сделать smile.gif это делать надо не в самом юните, а в тех методах готовых? unsure.gif
ЗЫ сила smile.gif еслиб у нас бы дали прям в аудитории решать чёнить, то я ваще сомневаюсь, чтобы ктото решил smile.gif + грузят нас чёт по математике, а профилирующие нифига ( програмирование - раз в 2 недели 1-2 пары ()
мисс_граффити
в самом модуле, разумеется.
вместо твоего "перелопачивания"
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; //теперь он указывает на первый элемент первой половины.


примерно так.
не проверяла, но вроде проблем не должно быть.....
если интересно - экспериментируй smile.gif
volvo
Цитата
надо 2 указателя поменять местами, а не все элементы переставлять!!!! Это ж динамическая структура.
Юля, у нас, например, за такое можно было и по ушам получить от преподавателя. А знаешь, почему? Потому, что при использовании Стека ты имеешь право пользоваться ТОЛЬКО методами, доступными и применимыми к Стеку. Неважно, что ЭТО проще алгоритмически... В стек по определению можно закинуть элемент, можно вытащить оттуда элемент, и скопировать значение, хранящееся на вершине стека в переменную. ВСЁ... Все остальное - грязный хак, и не приветствуется...

Если исходники ЭТОЙ реализации стека недоступны, а есть только откомпилированный модуль - что будешь делать?
мисс_граффити
mega_chok.gif то есть забываем, как он организован, и вот так вот все перелопачиваем?
буду знать.
volvo
kr3v3tkus, кстати, по поводу твоей реализации - ты ввел в Memo символы (5 строк, по 3 символа в каждой, кроме последней, включая пробел):
Цитата
a c
b d
e f
g h
;
Что ты хочешь получить в результате? А то ты привел такой пример, что неясно...

Вполне возможно, что можно будет обойтись без трех доп. стеков...
kr3v3tkus
да, эт точно быстрее будет smile.gif буду осмысливать smile.gif пасибки большое за помощь нубу :D
зы
ёёё пока афк был тут уже столько написали ()
volvo чёт я сам не оч понял,
я имелл ввиду такое условие :
мемо1 - в нём идут такие символы в строках - a,b,c,d, а надо сделать в мемо2 - c,d,a,b
или я не про то говорю? smile.gif и ммм откуда эта цитата то smile.gif?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.