[C++] Implemantacja stosu, niepoprawna dane

0

Hi,

napisałem program, który zamienia dec na bin. Odwrócenie kolejności liczb zrealizowałem na stosie. Problem w tym, że otrzymuję niepoprawne dane wyjściowe. Dla podanego w kodzie n (n = 125) otrzymuję wynik w postaci 1011111.

 // hh.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

template <class T>
class Stos {
	enum{ssize = 100};
	T s[ssize];
	int index;
public:
	Stos() : index(0) {
	}
	void push(T in) {
		s[index++] = in; 
	}
	T pop() {
		return s[--index];
	}
	int size() {
		return index;
	}
};

int main() {
	Stos<int> x;
	int n = 125;
	int r;

	while(n > 0) {
		r = n % 2;
		n = n / 2;

		x.push(r);
		std::cout<<x.pop();
	}
	std::cin.get();
}	

Będę wdzięczny za pomoc.
Pozdrawiam

0

To nie to jest problemem, ale po co ci to: #include "stdafx.h" ?! Poczytaj o stosie, np tu: http://pl.wikibooks.org/wiki/Struktury_danych/Stosy

0

Hi,

używam Visual C++, stąd załączenie stdafx.h.
Dziękuję za linka, ale nie potrafię tam znaleźć odpowiedzi dlaczego mój kod nie działa jak należy.
Mogę prosić o jakąś podpowiedz ? :)

0

Odpowiedź jest oczywista. Zdejmujesz zaraz po wlożeniu na stos, czyli caly czas masz na stosie JEDNĄ liczbę...

#include <iostream>

template <class T>
class Stos
{
    enum {ssize = 100};
    T s[ssize];
    int index;
public:
    Stos() : index(0){}
    void push(T in)
    {
        //if(index<ssize)
            s[index++] = in;
        //else
        //throws...
    }
    T pop()
    {
        //if(index>0)
            return s[--index];
        //else
        //throws...
    }
    int size()
    {
        return index;
    }
    bool isEmpty()
    {
        return !index;
    }
};

int main()
{
    Stos<int> x;
    int n = 125;
    int r;
    while(n > 0)
    {
        r = n % 2;
        n /= 2;
        x.push(r);
    }
    while(!x.isEmpty())
        std::cout << x.pop();
    std::cin.get();
    return 0;
}
0

Witam, dziękuję bardzo za pomoc.
Przy nie spełnieniu warunków w pop i push proponujesz aby rzucił wyjątek? Tylko w którym miejscu go przechwycić, w funkcji ?

0

Tak, wyjątki, bo jak inaczej stwierdzisz czy metoda się powiodła czy nie?
Tam gdzie się wyjątki łapie, czyli tam gdzie tą metodę będziesz wykonywać.

try
{
  stos.push(x);
}catch( //i tak dalej
0

Tak, wyjątki, bo jak inaczej stwierdzisz czy metoda się powiodła czy nie?

Choćby przez zwracaną wartość…

0

@up ale w przypadku pop() nie bardzo możesz tak zrobić. Chyba że będziesz kombinował z dodatkowym argumentem gdzie zostanie zwrócona wartość / znak błędu. Ale to raczej zbędne kombinacje, skoro język umozliwia proste rozwiązanie ;]

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