Zadanie programowanie obiektowe.

0

Cześć, mam takie zadanko:
Proszę napisać definicję klas: Stack i StackElement.

StackElement:
Klasa ma zawierać dwa pola prywatne wybranych typów oraz
udostępniać następujące metody: konstruktor domyślny, konstruktor
dwu-parametrowy i getter lub gettery.

Stack:
Klasa ma realizować funkcjonalność stosu przechowującego
elementy typu StackElement a więc udostępniać konstruktory:
domyślny i jedno-parametrowy (rozmiar), metody push(), pop()
isEmpty() isFull().

Następnie proszę napisać program który sprawdzi poprawność
stworzonego rozwiązania.

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class StackElement {
private:
	int data;
	string name;
public:
	StackElement()
	{
		data=0;
		name="brak";
	}
	StackElement(int d, string n)
	{
		data = d;
		name = n;
	}	
	void getData()
	{
		cin>>data;
	}
	void getName()
	{
		cin>>name;
	}
};

class Stack {
private:
	int stackSize;
	StackElement element;
public:
	Stack()
	{
		stackSize = NULL;
		cout<<"Stack is empty"<<endl;
	}
	Stack(int s)
	{
		stackSize = s;
	}
	void push()
	{
		element.getData();
		element.getName();
		stackSize+=stackSize;
	}
	void pop()
	{
		
	}
	void isEmpty()
	{
		if(stackSize==0)
			cout<<"Stack is empty"<<endl;
	}
	void isFull()
	{
		if(stackSize==) // ???
			cout<<"Stack is full!"<<endl;
	}
};

int main()
{
	
return 0;
}

Stworzyłem coś takiego, nie umiem tutaj załatwić paru rzeczy i ogólnie nie do końca wiem co dalej robić. Proszę o pomoc!

1

W klasie Stack musi być jakaś struktura do przechowywania danych typu StackElement, np. tablica, jak tutaj:
https://www.tutorialspoint.com/cplusplus-program-to-implement-stack-using-array

1

Metody sprawdzające mają być typu logicznego, raczej nie powinny drukowac wewnątrz, ewentualne drukowanie może zrobić kod kliencki.

bool isEmpty()
    {
        if(stackSize==0)
            return true;
        return false // nie jest to najkrótszy kod, ale nieco podobny do twojego
    }
    bool isFull()
    {
 // albo tak
           return (stacksize== Xxxxx);
       }

Tutaj przypisanie NULL-a jest mylące, normalne zero, drukowanie jest zbędne


stackSize = NULL;
        cout<<"Stack is empty"<<endl;
0
#include <iostream> 
#include <string> 
#include <cstdlib> 
#define MAX_SIZE 100
int pos=-1;
using namespace std; 

class StackElement { 
private: 
    int data; 
    string name; 
public: 
    StackElement() { 
        data=0;
        name="brak";
        } 
    StackElement(int d, string n) { 
        data = d;
        name = n;
        } 
    void getData() { 
        cin>>data;
        } 
    void getName() {
        cin>>name;
        } 
};
class Stack {
private: 
    int stackSize; 
    StackElement element[]; 
    public:
    Stack() {
        stackSize = 0;
        cout<<"Stack is empty now."<<endl;
        }
    Stack(int s) {
        stackSize = s;
        }
    void push() {
        element[pos+1].getData();
        cout<<"Enter element name:"<<endl;
        element[pos+1].getName();
        pos++;
        }
    void pop() {
        pos--;
        }
    bool isEmpty() {
        if(stackSize==0)
             return true;
        }
    bool isFull() {
        if(pos==MAX_SIZE)
             return true;
        }
 }; 
int main() {
    Stack stack(MAX_SIZE);
    int choice;
    cout<<"1. Push in stack.\n2. Pop from stack.\n3. Display stack.\n4. Exit."<<endl;
    if(stack.isEmpty())
    	cout<<"Stack is empty."<<endl;
	do { 
        cout<<"Enter your choice"<<endl;
        cin>>choice;
        switch(choice) {
            case 1:
                 cout<<"Enter value:"<<endl;
                 stack.push();
                 break;
            case 2:
                 stack.pop();
                 break;
            case 3:
                cout<<"Soon-to-be displayer"<<endl;
                 break;
            case 4:
                cout<<"Exit"<<endl;
                break;
            default:
                cout<<"Invalid choice"<<endl;
        }
        if(stack.isFull()) {
        	cout<<"Stack is full!"<<endl;
    		break;
		}
	} while (choice != 4);
return 0; 
}

Okej, doprowadziłem to do takiej formy, ale mam jeden błąd - jak już umieszczę jeden element, to konsola sie zatrzymuje i nie przyjmuje więcej.

1

Nie, nie, przecież rozmiar tablicy w klasie Stack jest znany dopiero w runtime, więc musi być zadeklarowana, jako wskażnik (albo inna dynamiczna struktura). Te czytania danych w metodach są nieestetyczne, niech się o to martwi klient. Nie ma tam powiedziane, ale musi być jakaś domyślna wielkość stosu w bezparametrowym konstruktorze. I, finalnie, jakoś tak to będzie (Potrzebujesz jeszcze destruktor i jakiś sposób drukowania obiektu):

class StackElement {
		 
	private: 
	int data; 
	string name;
	public:
    StackElement() { 
        data=0;
        name="brak";
    } 
    StackElement(int d, string n) { 
        data = d;
        name = n;
    } 
    void getData(int d) { 
        data = d;
    } 
    void getName(string n) {
        name = n;
    } 
};

class Stack { 
	private:
	int N = 0;;
	int cnt = 0;
	StackElement * arr;
	public:
    Stack() {
        N = 10;
        arr = new StackElement[N];
    }
    Stack(int s) {
        N = s;
        arr = new StackElement[N];
    }
    void push(StackElement item) {
        arr[cnt++] = item;
    }
    StackElement pop() {
        return arr[--cnt];
    }
    bool isEmpty() {
        return cnt == 0;
    }
    bool isFull() {
        return N == cnt;;
    }
}; 
0
lion137 napisał(a):

Nie, nie, przecież rozmiar tablicy w klasie Stack jest znany dopiero w runtime, więc musi być zadeklarowana, jako wskażnik (albo inna dynamiczna struktura). Te czytania danych w metodach są nieestetyczne, niech się o to martwi klient. Nie ma tam powiedziane, ale musi być jakaś domyślna wielkość stosu w bezparametrowym konstruktorze. I, finalnie, jakoś tak to będzie (Potrzebujesz jeszcze destruktor i jakiś sposób drukowania obiektu):

    StackElement pop() {
        return arr[--cnt];
    }

Mógłbyś jeszcze mi wytłumaczyć na jakiej zasadzie to działa? Bo nie rozumiem tego

1 użytkowników online, w tym zalogowanych: 0, gości: 1