Ciao a tutti!
Ho un problema con un esercizio sugli stack. L'esercizio chiede di creare due stack , A e B; uno da cui prelevare elementi (A), uno in cui inserire elementi (B). Nel caso in cui lo stack A sia vuoto devono venire spostati, mediante pop-push gli elementi dallo stack B allo stack A.
Il problema sta nell'inserimento di elementi nello stack B, quindi credo nella funzione stack_push, riporto l'intero codice per completezza, spero qualcuno possa aiutarmi, grazie.
codice:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#define GROW_DELTA 10
#define SHRINK_DELTA 20
typedef int TInfo;
struct SArray{
TInfo *item;
int length;
int size;
};
typedef struct SArray TArray;
struct SStack{
TArray array;
};
typedef struct SStack TStack;
TArray array_create(int initial_length){
TArray a;
a.item=(TInfo*)malloc(sizeof(TInfo)*initial_length);
assert(a.item!=NULL);
a.length=initial_length;
a.size=initial_length;
}
void array_destroy(TArray *a){
free(a->item);
a->item=NULL;
a->length=0;
a->size=0;
}
void array_resize(TArray *a,int new_length){
if(new_length > a->size || new_length < a->size -SHRINK_DELTA){
int new_size=new_length+GROW_DELTA;
a->item=realloc(a->item, sizeof(TInfo)*new_size);
assert(a->item!=NULL || new_size!=0);
a->size=new_size;
}
a->length=new_length;
}
TStack stack_create(void){
TStack s;
s.array=array_create(0);
return s;
}
void stack_destroy(TStack *s){
array_destroy(&s->array);
}
void stack_push(TStack *s, TInfo x){
int n=s->array.length;
array_resize(&s->array, n+2);
s->array.item[n]=x;
}
TInfo stack_pop(TStack *s){
int n=s->array.length;
TInfo x=s->array.item[n-1];
array_resize(&s->array, n-1);
return x;
}
TInfo stack_top(TStack *s){
int n=s->array.length;
return s->array.item[n-1];
}
bool stack_is_empty(TStack *s){
return s->array.length==0;
}
int menu(){
printf("\n1) Inserire un elemento.\n");
printf("2) Prelievo di un elemento.\n");
printf("3) Verifica coda vuota.\n");
printf("4) EXIT.\n\n");
printf("Fai la tua scelta : ");
}
int main(){
TStack stackA,stackB;
int scelta=0;
TInfo elemento;
stackA=stack_create();
stackB=stack_create();
printf("----> %d", stackB.array.length);
while(scelta!=4){
menu();
scanf("%d", &scelta);
switch(scelta){
case 1 : printf("Inserire il nuovo elemento :\n");
scanf("%d", &elemento);
stack_push(&stackB, elemento);
break;
case 2 : if(stack_is_empty(&stackA)){
while(stackB.array.length!=0)
stack_push(&stackA , stack_pop(&stackB));
elemento=stack_pop(&stackA);
printf("ELEMENTO %d \n", elemento);
}
else {
elemento=stack_pop(&stackA);
printf("%d \n", elemento);
}
break;
case 3 :
break;
}
}
return EXIT_SUCCESS;
}