Gestione di uno stack

di il
3 risposte

Gestione di uno stack

Salve ragazzi sto scrivendo un programma per la gestione di uno stack solo che mi sta dando delle rogne vi posto tutto il sorgente sicuro ci saranno tanti errori e mi scuso ma gli stack non li guardo da qualche anno!! questo è il mio meglio per adesso



#include <stdio.h>

struct stack
{
    int vet[10];
    int top;
};

void  inizializza(struct stack*);
int pop(struct stack*);
void push(struct stack*, int);
void stampa(struct stack*);
int contr(struct stack*);

int main()
{
    struct stack *stack1=NULL;// Per annullare eventuali worring
    int scelta, elemento, controllo;
    
    inizializza(stack1); //inizializza il top a 0;
    
    do
    {
        printf("1:inserisci elemento\n");
        printf("2:preleva elemento\n");
        printf("3:stampa elemento\n");
        printf("4: esci\n");
        
        scanf("%d",&scelta);
        
        switch(scelta)
        {
            case 1:
                controllo = contr(stack1);
                if(controllo)                // se il top è minore di 10 posso inserire!
                {
                    printf("Inserisci l'elemento: ");
                    scanf("%d", &elemento);
                    push(stack1,elemento);
                }
                else
                    printf("error\n");        //top >=10   non posso inserire :-(
                break;
                
            case 2:
                if(!controllo)                            //se top è maggiore di 0 posso prelevare !
                {
                    elemento = pop(stack1);
                    printf("%d",elemento);
                }
                else                                // è impossibile prelevare con top =0   !
                    printf("error\n");
                break;
                
            case 3:
                if(controllo)                     //qui mi basta sapere che ho 1 elemento nel mio stack se è così posso stamparlo
                    stampa(stack1);
                else
                    printf("stack vuoto\n");
                break;
                
            case 4:
                printf("arrivederci\n");
                break;
                
            default:
                printf("error");
        }
    } while (scelta != 4);
    
    return 0;
}

void inizializza(struct stack *stack1)
{
    stack1->top=0;      // Metto nella parte della struttura top puntata dalla variabile stack 0 questo per far partire lo stack da 1 situazione pulita
}

int pop(struct stack *stack1)
{
    int x;
    
    x = stack1->vet[stack1->top]; /*inserisci in x il valore ottenuto da vet[top]   sintatticamente va  
                                                        scritto così*/
    
    stack1->top--;     //ho prelevato decremento il top!
    
    return x;
}

void push(struct stack *stack1,int x)//devo inserire un valore nuovo
{
    stack1->top++;//faccio spazio aumentando di 1 il top
    stack1->vet[stack1->top] = x;// mi copio il valore nella locazione
    
}


void stampa(struct stack *stack1)
{
    int i;
    
    for(i = 0; i < stack1->top; i++)
    {
        printf("%d", stack1->vet[stack1->top]);//stampa alemento indicato dal top
    }
}




int contr(struct stack *stack1)
{
    if(stack1->top >=9)/* occorre studiare come si comporta quando viene chiamato nei casi limiti con top      
                                                                                    ==0 e con top =-=9*/
        return 0;
    else
        return 1;
}
grazie

3 Risposte

  • Re: Gestione di uno stack

    ]l'ho migliorato adesso mi sembra che funzioni tutto l'unica cosa è che mi da tanti warring vi posto il nuovo sorgente secondo me dovrei usare un puntatore a puntatore per togliere i warring ma poi non li riesco a gestire nei vari sottoprogrammi ecco tutto il sorgente:
    
    #include<stdio.h>
    
    
    struct stack{
        int vet[10];
        int top;
        int  pieno,vuoto;
    
    
    };
    
    void inizializza(struct stack*);
    int controlla_pieno(struct stack*);
    int controlla_vuoto(struct stack*);
    void inserisci(struct stack*,int);
    int preleva(struct stack*);
    void stampa(struct stack*);
    
    
    int main(){
        struct stack *stack1 = NULL ;
        int scelta,contr_vuoto,numero,contr_pieno;
        
        inizializza(&stack1);//pericolo"
        do{
            
        printf(" ______________________\n");
        printf("|1:preleva.............|\n");
        printf("|2:inserisci...........|\n");
        printf("|3:stampa..............|\n");
        printf("|4:inizializza.........|\n");
        printf("|5:esci................|\n");
        printf("!----------------------!\n");
            scanf("%d",&scelta);
            
        
            switch(scelta){
                    
                case 1:  contr_vuoto=controlla_vuoto(&stack1);// pericolo!
                    if(contr_vuoto!=0)
                    {
                        numero=preleva(&stack1);// pericolo!!
                        printf("%d\n",numero);
                    }
                    
                        else printf("errore stack vuoto\n");
                break;
                    
                    
                case 2:
                    contr_pieno=controlla_pieno(&stack1);  //pericolo!!!
                    if(contr_pieno!=0)
                    {
                          printf("inserisci il valore\n");
                          scanf("%d",&numero);
                             inserisci(&stack1,numero);// pericolo!!
                    }
                    else
                        printf("errore stack pieno\n");
                break;
                    
                    
                        
                case 3:
                        contr_vuoto=controlla_vuoto(&stack1);//pericolo!!!!
                        if(contr_vuoto!=0)
                        {
                            stampa(&stack1);// pericolo!!!!!
                            
                        }
                            else
                                printf("impossibile stampare stack vuoto!\n");
                break;
                    
                case 4:
                    inizializza(&stack1);//pericolo !!!!!!
                break;
                    
                case 5:
                    printf("arrivederci\n");
                break;
                default: printf("scelta errata\n");
                    }
            
        }while(scelta!=5);
      
    
        
    
    
    }
    
    
    void inizializza( struct stack *stack1){
        stack1->top=0;
        stack1->pieno=0;
        stack1->vuoto=0;
    
    }
    
    int controlla_vuoto(struct stack *stack1){
    if(stack1->top==0)
        
        return(0);
    else return 1;
    
    
    }
    
    int preleva(struct stack *stack1){
          stack1->top--;
        int x;
        x=stack1->vet[stack1->top];
      
        if(stack1->top==0)
            stack1->vuoto=0;
        
        return x;
    
    }
    int controlla_pieno(struct stack *stack1){
    
    if(stack1->top==10)
        return 0;
    else return 1;
    
    }
    
    
    
    void inserisci(struct stack *stack1,int x){
    
        stack1->vet[stack1->top]=x;
        stack1->top++;
        if(stack1->top==10)
        {stack1->pieno=1;
        }
    }
    
    void stampa(struct stack *stack1){
    
        int x;
        int i;
        x=stack1->top--;
        for(i=x;x--; ){
            printf("   _______ \n");
            printf("  |       |\n");
            printf("     %d    \n ",stack1->vet[x]);
            printf(" |_______|\n");
        }
    }
    
    
  • Re: Gestione di uno stack

    
    ... prototypes
    void inizializza(struct stack*);
    ...
    
    
    struct stack *stack1 = NULL;
    ...
    inizializza(&stack1);//pericolo"
    ...
    
    passi l'indirizzo di ptr a struct in tutte le funzioni mentre queste ultime attendono un ptr a struct.
    Come sei riuscito ad eseguirlo?
  • Re: Gestione di uno stack

    Ora mi funziona ho tolto il puntatore a struttura però ho qualche bug nel senso certe volte quando stampo e poi prelevo mi preleva il numero corrispondente a top-2 la prima volta e successivamente top -3 poi -4 etc
Devi accedere o registrarti per scrivere nel forum
3 risposte