Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C++ OOP - implementace stacku pomocí pointerů

No, v záchvatu programátorského entusiasmu jsem se rozhodl naprogramovat ještě rozhraní pro uživatele, aby se stack dal ovládat jen přes konzoli. Mám ale další problémy :D

1. Háže mi error IsEmpty, a vůbec nevím proč, ověřuju prostě, když top->data == NULL, ale program přestane pracovat, jako ybch tam měl nějakou mekonečnou smyčku či co :D

2. Jak se dá ošetřit situace, že potřebuji chybové hlášení třeba z funkce Top, Pop nebo Num_from_Push, ale tyto můžou vracet jen int? Řeším to tak, že vracím 909090 a doufám, že to nikdo nezadá, ale určitě to jde řešit lépe...

A takhle vypadá můj současný kód :D

#include <iostream>
#include <cstdlib> //kvuli EXIT_FAILURE
#include <string> //kvuli ovladani pro uzivatele
#include <cmath> //kvuli mocneni pri vypoctu cisla

using namespace std;

struct item{ //struktura - typ prvku v zasobniku
	int data;
	item *prev;
};

class stack{ //trida - zasobnik
private:
	item *top; //vrchol zasobniku
public:
	stack();
	void Push(int data);
	int Pop();
	int Top();
	bool IsEmpty();
	~stack();
};

stack::stack(){
	top = NULL;
}

void stack::Push(int data){
	item *node = new item; //prvek zasobniku

	node->data = data;
	node->prev = top;
	top = node;
}

int stack::Pop(){
	if(top == NULL){
		/*cout << "Neni co odebrat!" << endl;
		exit(EXIT_FAILURE);*/
		throw "Neni co odebrat!";
	}else{

	item *del = new item;
	del = top;

	int ret = top->data; //pro return
	top = top->prev;

	delete del;
	
	return ret;
	}
}

int stack::Top(){
	if(!IsEmpty()){
		return top->data;
	}else{
		return 909090;
	}
}

bool stack::IsEmpty(){
	if(top->data == NULL){
		return false;
	}
	return true;
}

stack::~stack(){

}

void ToLower(string &com){
	int last = com.length() - 1;  

	for(int i = 0; i <= last; i++){
		com[i] = tolower(com[i]);
	}
}

int Num_from_Push(string com){
	int last = com.length() - 1;

	if(!isdigit(com[last])){
		return 909090;
	}
	
	int i = 0;
	int cislo = 0;

	while(com[last] != ' ' && com[last] != 'h'){
		cislo += ((com[last] - 48) * pow(10.0, i));
		i++;
		last--;
	}
	return cislo;
}

void Control(stack object){
	cout << "Zadavejte prikazy pro praci se zasobnikem: Push 'cislo', Pop, Top, IsEmpty. Pro ukonceni programu pouzijte prikaz End." << endl;
	string com; //prikaz

	do{
		getline(cin, com);
		ToLower(com); //prevedu prikaz na mala pismena kvuli preklepum

		if(com == "end"){
			exit(EXIT_SUCCESS);
		}else if(com[0] == 'p' && com[1] == 'u' && com[2] == 's' && com[3] == 'h'){
			if(Num_from_Push(com) == 909090){
				cout << "Spatne zadana hodnota pro vlozeni!" << endl;
			}else{
				object.Push(Num_from_Push(com));
			}
		}else if(com == "pop"){
			cout << object.Pop() << endl;
		}else if(com == "top"){
			if(object.Top() == 909090){
				cout << "Zasobnik je prazdny!" << endl;
			}else{
				cout << object.Top() << endl;
			}
		}else if(com == "isempty"){
			if(object.IsEmpty()){
				cout << "Zasobnik je prazdny." << endl;
			}else{
				cout << "Zasobnik neni prazdny." << endl;
			}
		}else{
			cout << "Spatny prikaz!!! Mozne prikazy jsou Push, Pop, Top, IsEmpty nebo End." << endl;
		}
	}while(com != "end");
}

int main(){
	stack a; //objekt tridy stack

	//Control(a);

	//a.IsEmpty();

	a.Top();

	return 0;
}

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny