Verem osztály összes funkciójának elkészítése

Írjunk verem osztályt, amely megvalósítja az alábbi, a Stack.h állományban található osztálydefiníciót!


class Stack

{

      unsigned int elementNum;

      int *pData;

 

public:

      Stack() {elementNum=0;pData=NULL;}

      // A másoló konstruktor szükséges a dinamikus adattagok miatt

      Stack(const Stack& theOther);

      // A destruktor felszabadítja a dinamikus adattagot

      ~Stack() {if(pData!=NULL) delete[]pData;}

     

      bool isEmpty()const{return !elementNum;}

      void pop(int& element);

      void push(int element);

      // Az = operátor, amely a mély másolást valósítja meg

      const Stack& Stack::operator = (const Stack& theOther);

};



A megoldásért kattints ide!

(A megoldás feltételez néhány olyan konstrukciót, amelyek csak a félév utolsó harmadában kerülnek elő. Ilyenek a kivételkezelés, az STL string osztálya. A megoldás ezen nyelvi konstrukciókat használó részeit az első időkben ugorjuk át, ilyenkor csak a
- konstruktor, másolókonstruktor
- destruktor
- operátor =
meglétére és implementálására figyeljünk. A megoldás színvonala a ZH-n már elvárt, de a félév első felében egyáltalán nem.)



A Stack.h állomány tartalma:

#ifndef STACK_H
#define STACK_H

 

#include<stdio.h>

#include<stdexcept>

#include<string>

 

class stack_exception: public std::exception

{

      std::string message;

 

public:

      stack_exception(std::string message):message(message){};

 

      const char * what()const

      {

            return message.c_str();

      }

 

};

 

class Stack

{

      unsigned int elementNum;

      int *pData;

 

public:

      Stack() {elementNum=0;pData=NULL;}

      // A másoló konstruktor szükséges a dinamikus adattagok miatt

      Stack(const Stack& theOther);

      // A destruktor felszabadítja a dinamikus adattagot

      ~Stack() {if(pData!=NULL) delete[]pData;}

     

      bool isEmpty()const{return !elementNum;}

      void pop(int& element);

      void push(int element);

      // Az = operátor, amely a mély másolást valósítja meg

      const Stack& Stack::operator = (const Stack& theOther);

};

#endif /*STACK_H */


A stack.cpp állomány:

#include <limits>

#include <assert.h>

#include "Stack.h"

 

using namespace std;

 

 

Stack::Stack(const Stack& theOther)

{

      // Az operator=-t hívjuk,

      // és az érvényes adatot feltételez

      pData = NULL;

 

      *this=theOther;

}

 

const Stack& Stack::operator = (const Stack& theOther)

{

      assert(this != &theOther);

 

      // Felszabadítjuk az eddigi adatokat

      if(pData!=NULL)

      {

            delete [] pData;

      }

 

      // Átmásoljuk a másik verem tartalmát

      if(theOther.elementNum==0)

      {

            elementNum=0;

            pData=NULL;

      }

      else

      {

            elementNum=theOther.elementNum;

            pData=new int[elementNum];

            for(unsigned int i=0;i<elementNum;i++)

            {

                  pData[i]=theOther.pData[i];

            }

      }

      return *this;

}

 

void Stack::pop(int& element)

{

      if(elementNum==0)

      {
            
// A félév elején ez egy lehetséges jó megoldás:
            // cerr << "Data request from empty stack." << endl;

            throw stack_exception("Data request from empty stack.");

            return;

      }

 

      if(elementNum==1)

      {

            element=pData[0];

            delete []pData;

            pData=NULL;

            elementNum=0;

            return;

      }

 

      elementNum--;

      element=pData[elementNum];

      int* pTemp=new int[elementNum];

 

      for(unsigned int i=0;i<elementNum;i++)

      {

            pTemp[i]=pData[i];

      }

      delete[] pData;

      pData=pTemp;

 

}

 

void Stack::push(int element)

{

      // C++-ban az UINT_MAX helyett a limits headerben található

      // numeric_limits sablont használjuk a maximális unsigned int érték

      // lekérdezésére

      if(elementNum==numeric_limits<unsigned int>::max())

      {
         // A félév elején ez egy lehetséges jó megoldás:
         // cerr << "Stack is full." << endl;


            throw stack_exception("Stack is full.");

            return;

      }

 

      int* pTemp=new int[elementNum+1];

 

      for(unsigned int i=0; i<elementNum;i++)

      {

            pTemp[i]=pData[i];

      }

 

      pTemp[elementNum]=element;

 

      if(pData)delete[]pData;

      pData=pTemp;

      elementNum++;

}

 

Egy lehetséges tesztprogram:

#include <iostream>

#include "Stack.h"

 

using namespace std;

 

void main(void)

{

      Stack s1;

      s1.push(3);

      s1.push(4);

 

      // Másolókonstruktor tesztje

      Stack s2(s1);

 

 

      try

      {

            while(!s2.isEmpty())

            {

                  int element;

                  s2.pop(element);

                  cout << element << endl;

            }

 

            int element;

            s1.pop(element);

            cout << "pop: " << element << endl;      

            s1.pop(element);

            cout << "pop: " << element << endl;

 

            /*

            // Ez a rész kivételt dob...

            s1.pop(element);

            cout << "pop: " << element << endl;

            */

 

            s1.push(42);

            Stack *pS3=new Stack(s1); // Másolókonstruktor

            pS3->pop(element);

            cout << "pop: " << element << endl;

            delete pS3;

      }

      catch(const stack_exception& e) // Elkapjuk a Stack kivételeit

      {

            cout << e.what() << endl;

      }

}

 

 

 


 




2008.01.11. 14:28:36 |  Permalink  |  Hozzászólások száma: 0  |  Tárgyszavak: Dinamikus adattagok


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások