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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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