wkładanie 2 elementu na stos

wkładanie 2 elementu na stos
R6
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 7 lat
  • Postów:37
0

Witam mam problem z metodą Push ponieważ program wysypuje się przy nałożeniu 2 elementu na stos. Proszę was o pomoc i z góry dziękuję.
tak wygląda definicja klasy

Kopiuj
 
class stack
{
public:
    stack();
    ~stack();
    void push(int a);
    int pop();
    void clear();
    bool isempty();

private:
    int top;
    int *dane;
    int size;
};
Kopiuj
 #include <assert.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include "stack.h"

using namespace std;

stack::stack()
{
	this->top=0;
	this->size=1;
	this->dane=new int[1];
}

stack::~stack()
{
}

void stack::clear()
{
	this->top=0;
	this->size=1;
}

void stack::push(int a)
{

if(top==(size-1)){

	int newsize=2*(this->size);
	int *newdane=new int[newsize];

	int newtop=newsize-top-1;
	int i=newsize; 
	int x=size;

		if(newdane){
		
			for(int k=0;k<top;k++){

				newdane[i-k]=this->dane[x-k];
			}

			this->top=newtop;
			this->size=newsize;
			this->dane=newdane;
			delete[] newdane;
			}

		this->dane[this->top]=a;
		this->top--;
		}

else{
	
	this->dane[this->top]=a;
	this->top--;
	}
}

int stack::pop()
{
	this->top--;
	return this->dane[this->top+1];
}

bool stack::isempty(){

if( (this->top) == 0 )
	 return true;
else
	 return false;
}
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

ponieważ próbujesz wykonać: dane[-1]=a;


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
R6
w której linijce ?
R6
ale przecież po przypisaniu obniżam wskaźnik top .. ? nie rozumim
_13th_Dragon
weź odpal z debugerem i prześledź ktok po kroku.
R6
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 7 lat
  • Postów:37
0

problem pojawia się podczas petli for w czasie przypisania starych danych do nowych danych

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Przepisz całość:

  1. Nie wpisuj liczb od końca tablicy tylko od początku (dziwny ten pomysł - od tyłu).
  2. Użyj funkcji memcpy()
  3. Nie powtarzaj fragmentów kodu.
  4. Nie używaj bez sensu this
  5. Napisz poprawnie destruktor
  6. Nie używaj int dla określenia rozmiaru, użyj unsigned lub size_t

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
R6
skopiowanie działa natomiast dodanie elementu na szczyt stosu nie działa :(
R6
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 7 lat
  • Postów:37
0

wrzucam te metody jeszcze raz ale problem pojawia się teraz nie przy przypsywaniu a do elementu tablicy przy 2 i 3 razie gdy inciuje push

Kopiuj
 #include <assert.h>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include "stack.h"
#include <string>

using namespace std;

stack::stack()
{
	this->top=0;
	this->size=1;
	this->dane=new int[1];
}

stack::~stack()
{
}

void stack::clear()
{
	this->top=0;
	this->size=1;
}

void stack::push(int a)
{
	static int n = 1;
if(size<n){

	int newsize=2*(size);
	int *newdane=new int[newsize];
	
	if (newdane == NULL) cout << "nie mozna stworzyc wiekszej tablicy" << endl;
	else{

		if (newdane){

			for (int k = 0; k < top; k++){
				memcpy(&newdane[k],&dane[k],sizeof(int));
				
			}

			size = newsize;
			delete[] dane;
			dane = newdane;
			n++;
			dane[top++] = a;

		}
		
		
		
	}
		}

else{
	n++;
	memcpy(&dane[top++],&a,sizeof(int));
	
	}
}

int stack::pop()
{
	
	return dane[top--];
}

bool stack::isempty(){

if( (this->top) == 0 )
	 return true;
else
	 return false;
}
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Z 6 punktów tylko dwa zrozumiałeś :/
Trzeba myśleć zamiast kombinować, to jest całość:

Kopiuj
class stack
  {
   private:
   unsigned top,size;
   int *dane;
   public:
   stack():top(0),size(0),dane(0) {}
   ~stack() { delete[] dane; }
   void push(int v);
   int pop() { return dane[--top]; }
   void clear() { top=size=0; }
   bool empty() { return !top; }
  };

void stack::push(int v)
  {
   if(top>=size)
     {
      size=size?2*size:1;
      int *tmp=new int[size];
      memcpy(tmp,dane,top*sizeof(int));
      delete[] dane;
      dane=tmp;
     }
   dane[top++]=v;
  }

Pisane z palca, już trochę poprawiłem.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
R6
mam pytanie dlacego przypisanie tej pojedynczej cyfry nic nie ddało ? tzn nie przypisywało ? jakby co to używam vs 2013. po kompilacji z Twoim kodem jest podobnie jak z moim
_13th_Dragon
dało, tylko nie potrafiłeś wyjąć, źle zrozumiałeś sens memcpy, nadal powtarzasz fragmenty kodu, nadal używasz int, nie dopisałeś destruktor itp

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.