Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Реализация стека


Автор: tatu 14.12.2009, 20:13
Люди помогите пожайлуста. Гоняю программу 3 дня...не понимаю почему у меня не пашет процедура которая меняет элементы с друг другом на заданных позициях.

Код

  public void swap(int x, int y)
        {
            if (x < y && x> 1)
            {
                int i = 0; int tmp = 0; int tmp1 = 0;
                El vsp = new El();
                vsp = top;
                while (vsp != null)
                {
                    i++;
                    if (i == x) { tmp = vsp.Data; }
                    vsp = vsp.next;

                }
                vsp = null;
                vsp = top; i = 0;
                while (vsp != null)
                {
                    i++;
                    if (i == y) { tmp1 = vsp.Data; }
                    vsp = vsp.next;
                }

                cut(x); cut(y);
                ins(x, tmp1);
                ins(y, tmp);
            }

        }



где cut и ins процедуры удаления элемента и вставки

Добавлено через 6 минут и 43 секунды
это сама программа

Автор: ДобренькийПапаша 14.12.2009, 20:29
Я не читал код, но полагаю, что дело в этом:
Вы оттуда откуда вызываете swap напишите swap(ref int x, ref int y).
И где сама функция определена аргументы с ключевым словом ref напишите.

Нет наверно, не поэтому. Скачал ваше программу. Написана плохо. Именования надо править. Ничего не понятно.
Когда вызываете swap передаёте аргументы как Int16, а сама функция Swap принимает int (Int32)...
Все кнопки именованы как buttonX, код у вас та ещё жесть)))

Я читать не буду больше)))

Автор: tatu 14.12.2009, 20:48
ну я только учусь..недавно просто разобрали....хочется зачет получить автоматом, чтобы избавиться от программирования.

Как подправить можно?

Автор: ДобренькийПапаша 14.12.2009, 21:10
Тут править всё нужно. От начала и до конца. Вообще так как задача реализовать стек очень популярная, то рекомендую погуглить и скопипастить уже нормальную реализацию. И разобраться в ней толком. Понять что у вас криво. Ну поработать немножко в общем. Если работать не хотите, то просто скопируйте где-нибудь. Этого добра я уверен вы много найдёте)))

Автор: tatu 14.12.2009, 21:12
самое смешное что ищу в гугле и не нахожу....покачал учебников тоже не нашел...

Автор: ДобренькийПапаша 14.12.2009, 21:18
Можете преподу дать код на С++)))

А вот http://blog.nguen.net/post234-queue_stack_c_sharp.html про очередь и стек в .NET.

Код


#include <iostream.h>
 
struct Node {   //структура Node – это список
 int d;         //элемент списка
 Node *p;       //указатель на следующий элемент списка (стека)
 };
 
void push(Node **top, int d);  //функция будет помещать элемент в стек
                               // top – указатель на вершину стека
pop(Node **top);               //функция будет извлекать элемент их стека
                               //вершина которого - top
 
void push(Node **top, int d)   
{ Node *pv = new Node;        //объявляем новую динамическую переменную типа Node
  pv->d=d;                    //записываем  значение, которое помещается в стек
  pv->p=*top;                 //связываем новый элемент стека с предыдущим
  *top=pv;                    //новый элемент стека становится его вершиной
}
 
int pop(Node **top)        
{ int temp=(*top)->d;    //извлекаем в переменную temp значение в вершине стека
  Node *pv=*top;         //запоминаем указатель на вершину стека, чтобы затем 
                         //освободить выделенную под него память   
  *top=(*top)->p;        //вершиной становится предшествующий top элемент
  delete pv;             //освобождаем память, тем самым удалили вершину
  return temp;           //возвращаем значение, которое было в вершине
}
 
 
int main()
{
 char v[24]="25 10 7 3 * + 1 1 + * +";
 clrscr();
 Node *top=0;
 int a,b;
 for (int i=0; i<=23; i++)
 {
    if (v[i] == '+') push(&top,pop(&top)+pop(&top));
    if (v[i] == '*') push(&top,pop(&top)*pop(&top));
    if ((v[i]>='0') && (v[i]<='9'))  push(&top,0);
    while ((v[i]>='0')&&(v[i]<='9')) push(&top,10*pop(&top)+(v[i++]-'0'));
 }
 cout<<pop(&top);
 return 0;
}


Автор: RWander 15.12.2009, 19:08
Вообще в .NET Framework есть готовый класс Stack (http://msdn.microsoft.com/ru-ru/library/system.collections.stack.aspx)
и его generic-реализация: http://msdn.microsoft.com/ru-ru/library/3278tedw.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)