C++ stos i kolejka jak zrobić dynamiczne przydzielanie pamięci?

0

Witam
Jestem początkującym programistą. Proszę o sprawdzenie kodu w poszukiwaniu ewentualnych błędów oraz o podpowiedź jak zrobić dynamiczne przydzielanie pamięci w stosie lub w kolejce?

#include <cstdlib>
#include <iostream>

using namespace std;

struct stos
{
       int max;
       int w;
       int Tab[10];
};

struct kolejka
{
		int max;
		int p, k;
		int tab[10];
};

void starts(stos*s)
{
     s->max=10;
     s->w=-1;
}

void startk(kolejka*Q)
{
	Q->max=10;
	Q->p=-1;
	Q->k=-1;
}

void attach(kolejka*Q, int x)
{
	if((Q->p == 0 && Q->k == Q->max-1)||(Q->k == Q->p-1))
	cout << " Kolejka jest pelna. Nie moge dodac " << x << endl;
	else
	{
		if(Q->k < Q->max-1)
		{
			Q->k++;
			Q->tab[Q->k] = x;
			if(Q->p == -1) { Q->p++; }
		}

		else
		{
			Q->k = 0;
			Q->tab[Q->k] = x;
		}
	}
}

void push(stos*s, int x)
{
     if(s->w==s->max-1)
     cout <<" Stos pelny\n";
     else
     {
         s->w++;
         s->Tab[s->w]=x;
     }
}

void dattach(kolejka*Q)
{
	if (Q->p == -1)
	{
		cout << " Kolejka jest pusta, nie ma czego usunac.\n ";
	}
	else
	{
		cout << " Usunieto element " << Q->tab[Q->p]<<endl;
		if (Q->p < Q->max-1)
		{
			Q->p++;
		}
		else
		{
			Q->p=0;
		}
		if (Q->p == Q->k+1)
		{
			Q->p = -1;
			Q->k = -1;
		}
	}
}

void pop(stos*s)
{
     if(s->w==-1)
     {
         cout <<" Stos jest pusty\n";
     }
     else
     {
         cout <<" Usunieto element " <<s->Tab[s->w] <<endl;
         s->w--;
     }
}

void wyswietlk(kolejka*Q)
{
	
	if (Q->p == -1)
	{
		cout << " Kolejka jest pusta.\n ";
	}
	else
	{
		int i=Q->p;
		do
		{
			if(i==Q->max)i=0;
			cout << Q->tab[i]<< "|";
			i++;
		}
		while (i!=Q->k+1);
	}
}

void wyswietls(stos*s)
{
     if(s->w==-1)
     cout <<" Stos pusty\n";
     else
     {
         cout <<" Elementy stosu: \n";
         for (int i=s->w; i>=0; i--)
         {
             cout <<s->Tab[i] <<endl;
         }
     }
}

int main(int argc, char *argv[])
{
    int wyb=0, wyb2=0;
    stos mojstos;
    starts(&mojstos);
    kolejka mojakolejka;
    startk(&mojakolejka);
    do
    {
		
		
		cout <<" Wcisnij:\n 1. Jezeli chesz korzystac ze stosu" <<endl
			 <<" 2. Jezeli chcesz korzystac z kolejki" <<endl
			 <<" 3. Jezeli chcesz zakonczyc program" <<endl
			 <<" Jaki jest Twoj wybor: ";
			 cin >> wyb;
			 	
			 switch (wyb)
			 {
				 case 1:
				 {
				  	do
					 {
				    	cout <<"\n 1. Dodanie elementu do stosu" <<endl
				        	 <<" 2. Usuniecie elementu ze stosu" <<endl
				         	 <<" 3. Wydruk elementu struktury" <<endl
				         	 <<" 4. Koniec programu"<<endl
				         	 <<" 5. Powrot do glownego menu"<<endl
							 <<" Wybierz co chcesz zrobic: ";
				    	cin >> wyb2;
				    	switch (wyb2)
				    	{
				           case 1: 	int x;
				    				cout <<" Jaki element dodac: ";
				    				cin >> x;
									push(&mojstos, x);
				           			break; 
						   case 2: 	pop(&mojstos);
						   			break;
				           case 3: 	wyswietls(&mojstos);
				           			break;
				           case 4:	wyb=3; wyb2=5;
									break;
						   case 5:  break;
						   default: cout <<" Nie ma takiej opcji\n";
						   			break;
				        }
					 }
					 while(wyb2 != 5);
					 break;
				 }
				 case 2:
				 {
					  do
					 {
						cout <<"\n 1. Dodanie elementu do kolejki" <<endl
				        	 <<" 2. Usuniecie elementu z kolejki" <<endl
				         	 <<" 3. Wydruk elementu struktury" <<endl
				         	 <<" 4. Koniec programu"<<endl
				         	 <<" 5. Powrot do glownego menu"<<endl
							 <<" Wybierz co chcesz zrobic: ";
				    	cin >> wyb2;
				    	switch (wyb2)
				    	{
				           case 1: 	int x;
				    				cout <<" Jaki element dodac: ";
				    				cin >> x;
				    				attach(&mojakolejka, x);
									break; 
						   case 2: 	dattach(&mojakolejka);
						   			break;
				           case 3: 	wyswietlk(&mojakolejka);
				           			break;
				           case 4:  wyb=3; wyb2=5;
									break;
						   case 5:  break;
						   default: cout <<" Nie ma takiej opcji\n";
						   			break;
				        }
					 }
					 while(wyb2 != 5);
					 break;
				}
				case 3: break;
				default: cout <<" Nie ma takiej opcji\n";
			 }
   }
   while(wyb!=3);
   
   
    system("PAUSE");
    return EXIT_SUCCESS;
}
0

Możesz użyć realloc do dynamicznego rozszerzania. Jeśli z góry nie wiadomo ile elementów posiadać będzie twój "stos". Tzn na początku allokujesz sobie pamięci trochę na zapas a później jeśli przekroczymy ten zakres to doalokowujemy dodatkową pamięć(podobnie jak działa vector)

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