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;
}