2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Реализовать вручную шаблон для Стека. С++
Сообщение29.04.2009, 20:29 


09/09/08
30
Россия
необходимо написать самому шаблон для Стека с базовыми функциями push, pop и т.д.
реализовал некоторые из них возникли проблемы с компиляцией, не могу проверить работу функции. Посмотрите код, ПОЖАЛУЙСТА может я что-то не так делаю?!
Код:
#include <iostream.h>
template <class T>
class stack
{
   T* v;
   T* p;
   int sz;
public:
   stack(int s);
   ~stack(){delete [] v;}
   void push(T a);
   T pop();
   int isempty();
   int size() const {return p-v;}
};
template <class T> int stack<T>::isempty()
{ int k;
if (p-v!=0) {
   cout<<T<<endl;
}
else
  k=0;
return k;
}

template <class T> stack<T>::stack(int s)
{
   v=p=new T[sz=s];
};
template <class T> void stack<T>::push(T a)
{
*p++=a;
};
template <class T> void stack<T>::pop()
{
   return *--p;
}

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <tchar.h>
#include <iostream.h>
#include "stack.h"
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{   stack <int> s;
   for (int i=0; i < 6; i++)
   {
    s.push(i);
   };
   cout<<"Печать стека"<<endl;
   while (!s.empty())
      cout<<s.pop<<endl; // ошибка в этом месте!
   return 0;
}
//---------------------------------------------------------------------------


 Профиль  
                  
 
 
Сообщение29.04.2009, 21:31 


06/04/09
156
Воронеж
Вы определитесь: в описании у вас поп возвращает Т, а в реализации воид... как только компилятор не ругается.

 Профиль  
                  
 
 
Сообщение30.04.2009, 13:41 


26/02/06
78
Russia, Nizhny Novgorod
Я две недели назад набросал красивый однопедальный стек на C++ с использованием шаблонов в обучающих целях, когда вам нужно решение? Раньше, чем он будет принят выложить не могу.

 Профиль  
                  
 
 
Сообщение30.04.2009, 14:33 


09/09/08
30
Россия
решение нужно будет где-то к числу 15-16 мая.если будет раньше и на этом спасибо.
p.s. а что значит однопедальный стек?[quote][/quote]

 Профиль  
                  
 
 
Сообщение30.04.2009, 14:52 


26/02/06
78
Russia, Nizhny Novgorod
Moko
Однопедальный - это не научный термин, а термин программистского жаргона, который означает примитивность обсуждаемой системы. Приемки будут на следующей неделе во вторник и в четверг, если всё пройдет гладко, выложу.

Немного о реализации: стек сделан как контейнер CStack для элементов CStackItem, которые могут содержать данные любого заранее определенного типа (string в моём случае). Вам советую поступать также, а то у вас стек (контейнер) и элемент - всё в одной каше. В контейнере есть счетчик элементов, в принципе, можно и без него, если реализовать Count как последовательный обход всей цепочки элементов.

Алгоритмы перевел с псведокода из статьи Stack в Wikipedia.

P.S. Стек был реализован для решения самого примитивного варианта классической задачи о скобках.

 Профиль  
                  
 
 
Сообщение02.05.2009, 15:50 


09/09/08
30
Россия
могли бы посмотреть мою реализацию, дело в том что при вызове метода resize() программа вылетает, не могу понять в чем причина.(остальное все работает)
Код:
#include <iostream.h>
template <class T>
class stack
{
    T* p;
    int sz; // кол-во элементов
    int capacity; // общая емкость
public:
    stack();
    stack(int s);
    ~stack();
    void push(T a);
    T pop();
    bool isempty();
    int size() const;   // возвращает общий размер стека
    int length() const;   // возвращает размер содержимого стека
    void resize(int size); // изменить размерность стека
};
// проверка на пустоту
template <class T> bool stack<T>::isempty()
{
return (sz==0);
};
// деструктор
template <class T> stack<T>::~stack()
{
    delete [] p;
}
//пустой конструктор
template <class T> stack<T>::stack()
{
    p=NULL;
};
// конструктор с параметром
template <class T> stack<T>::stack(int s)
{
    sz=0;
    p=new T[s];
    capacity=s;
};
// положить в стек
template <class T> void stack<T>::push(T a)
{
   if (sz==capacity)
    {
     capacity+=10;
     T* tmp = new T[capacity];
      for (int i=0; i<sz; i++)
          tmp[i]=p[i];
        delete [] p;
    p=tmp;
    }
   *p++=a;
   sz++;
};
// извлечь из стека
template <class T> T stack<T>::pop()
{   
    sz--;
    return *--p;
};
// размерность стека
template <class T> int stack<T>::size() const
{
    return capacity;   
}
// содержимое стека
template <class T> int stack<T>::length() const
{
    return sz;
}

//изменить размерность стека
template <class T> void stack<T>::resize(int size)
{
    T* tmp = new T[size];
   
    int cnt = sz;
    if (size > sz)
    {
        cnt = sz;
    }
    else
    {
        cnt = size;
    }

    for (int i = 0; i < cnt; i++)
          tmp[i] = p[i];

    delete [] p;
    p = tmp;
    sz = cnt;
    capacity = size;
}

#include "stdafx.h"
#include <conio.h>
#include <iostream.h>
#include "TStack.h"
int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    int n;
    cout<<"Введите размер стека"<<endl;
    cin>>n;
    stack <int> s(n);
    for (int j=1; j <= 5; j++)
    {
        s.push(j);
    };
    cout<<"Стек заполнен";
    cout<<"Содержимое стека"<<s.size()<<endl;
    cout<<"Общий размер стека"<<s.length()<<endl;
    cout<<"Введите новый размер стека"<<endl;
    int k;
    cin>>k;
    s.resize(k);
    cout<<"Извлечение содержимое стека"<<endl;
    while (!s.isempty())
      cout<<s.pop()<<endl;
    cout<<"Стек пуст";
    getche();
    return 0;
}

 Профиль  
                  
 
 
Сообщение02.05.2009, 22:13 


26/02/06
78
Russia, Nizhny Novgorod
Это глупость, а не стек, я сказал где посмотреть алгоритмы - в Википедии. В стеке в каждый момент должен храниться просто указатель на последний элемент, поэтому его размер не ограничен и, соответственно, resize() никакой нужен.

 Профиль  
                  
 
 
Сообщение03.05.2009, 11:10 


09/09/08
30
Россия
Да вы правы, я с вами не спорю!Но мне так сказал препод!я всего лишь исполняю просьбу препода.
я просто просил посмотреть на правильность того что я сделал.
Отлаживал программу, подозрения сводятся к копированию массивов вот тут
Код:
for (int i = 0; i < cnt; i++)
          tmp[i] = p[i];

    delete [] p;
    p = tmp;

потому что после ресайза, если стек был размером 10, а потом допустим стал 8, то при выводе содержимого стека печатается какая-то абракадабра, не знаете в чем проблема?

 Профиль  
                  
 
 
Сообщение03.05.2009, 12:35 


26/02/06
78
Russia, Nizhny Novgorod
Moko
А вы уверены, что вы вообще правильно поняли, что вам сказал преподаватель?

В первой версии кода направление было принято вполне правильное, надо было только его развить и избавиться от глупостей с указательной арифметикой, например, введя структуру.

Во второй версии от стека уже не осталось ничего кроме названия, а по факту - некое подобие реализации класса vector из STL. Стек должен эффективно расти, а тут каждый раз массивы будут копироваться, если емкость исчерпалась...

Если преподаватель сказал так сделать - он проф. непригоден.

А ошибка ваша в том, что вы не понимаете что такое *p++=a; и *--p;, процедура изменения размера к этом отношения не имеет никакого. Идите читать http://www.cplusplus.com/doc/tutorial/ , а потом можно будет разговор продолжить.

 Профиль  
                  
 
 
Сообщение03.05.2009, 16:08 


09/09/08
30
Россия
ZYV писал(а):
Moko
А вы уверены, что вы вообще правильно поняли, что вам сказал преподаватель?

да, уверен.
ZYV писал(а):
А ошибка ваша в том, что вы не понимаете что такое *p++=a; и *--p;, процедура изменения размера к этом отношения не имеет никакого

т.е. надо так p[sz++]=а и p[--sz]?

 Профиль  
                  
 
 
Сообщение03.05.2009, 18:29 


26/02/06
78
Russia, Nizhny Novgorod
Куда больше похоже на правду, только надо ещё проверять, не стало ли sz меньше нуля. И, кстати, пустой конструктор тоже бредов - в capacity и sz будут случайные значения вместо нулей.

 Профиль  
                  
 
 
Сообщение10.05.2009, 23:20 


21/04/09
25
В первой версии вы просто забыли поставить скобки

не

cout<<s.pop<<endl;

а

cout<<s.pop()<<endl;

Так что вы печатаете адрес функции pop, а не элемент стека.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: TheRuinedMap


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group