Pila con priorità in C

di il
8 risposte

Pila con priorità in C

Tra qualche giorno ho un esame di programmazione in C e tra le prove d'esame c'è questo esercizio:

Si vuole simulare la gestione dei processi dei record di attivazione della macchina virtuale
di un nuovo linguaggio di programmazione ad alto livello tramite una pila dinamica. La
struttura deve permettere di inserire gli elementi (cioè le invocazioni a funzione) con due
livelli di priorità: high (alta) e low (bassa). Un elemento ad alta priorità viene sempre
inserito in cima alla struttura. Un elemento a bassa priorità deve invece essere inserito
dopo quelli ada alta priorità ma prima di quelli eventualmente già presenti nella struttura.
Definire la struttura dati necessaria a memorizzare le informazioni descritte.
Implementare poi le funzioni: PushHigh, PushLow, Pop e EmptyStack che servono per
la gestione dei record di attivazione.
Implementare infine la funzione EliminaPriorità che trasformi la struttura data in una
struttura analoga in cui non vengono considerate le priorità ma solo l’ordine degli arrivi.


Io ho perciò utilizzato una Pila che, per quanto riguarda l'inserimento di un elemento ad alta priorità si comporta come una pila normale, se a bassa priorità scorre la pila per inserire l'elemento tra quelli a bassa priorità. Tuttavia, come posso implementare l'ultima funzione "EliminaPriorità"?
Grazie mille in anticipo

8 Risposte

  • Re: Pila con priorità in C

    Secondo me ti conviene l'implementazione mediante heap, sono più efficienti.

    Prova a scrivere le struct che hai pensato per la costruzione del dato astratto che possiamo provare a discuterne.
  • Re: Pila con priorità in C

    Il dato da inserire in coda sarà una struttura, questa struttura conterrà tutti i dati da processare e una variabile priorità.
    Una volta creato un nuovo dato e settata la sua priorità con numero > per priorita maggiori l'inserimento nella pila verrà eseguito cosi x tutti i dati
    -cerco il primo elemento con pari priorità
    -inserisco il dato prima di quello trovato
    Ora per togliere la priorità setti tutte le priorità a 0 e inserisci in lista con priorità 0
    Volendo puoi copiare la pila e settare a 0 la nuova pila o giocarci come più ti piace
  • Re: Pila con priorità in C

    E' necessario un campo della struttura che indica il tempo di arrivo, può essere anche semplicemente un intero, serve per riordinare le priorità in base all'ordine di arrivo.

    L'implementazione secondo me va fatta sempre con un heap, per avere ricerche O(nlogn) e non O(n).
  • Re: Pila con priorità in C

    Il tempo di arrivo non è necessario ne tanto più indicato nel testo ma soprattutto esige delle regole spesso difficilissime da implementare.
    L heap è facoltativo e in questo caso facilmente inseribile anche dopo aver già scritto tutto il codice, meglio stendere prima qualcosa di semplice e funzionante.
  • Re: Pila con priorità in C

    vbextreme ha scritto:


    Il tempo di arrivo non è necessario ne tanto più indicato nel testo ma soprattutto esige delle regole spesso difficilissime da implementare.

    JS96 ha scritto:


    Implementare infine la funzione EliminaPriorità che trasformi la struttura data in una
    struttura analoga in cui non vengono considerate le priorità ma solo l’ordine degli arrivi.
    Forse hai ragione tu e non ci si occupa degli elementi già in lista quando si trasforma la lista senza priorità; ma, dal testo ho inteso che, bisogna implementare una funzione che elimini le priorità trasformando la struttura dati in base all'ordine di arrivo considerando anche degli elementi già inseriti in coda.

    Non è difficile se si mantiene un contatore sui nodi e si fa un sorting discendente.

    vbextreme ha scritto:


    L'heap è facoltativo e in questo caso facilmente inseribile anche dopo aver già scritto tutto il codice, meglio stendere prima qualcosa di semplice e funzionante.
    Ovviamente è facoltativo, il mio era solo un consiglio ci mancherebbe altro. Che sia facilmente inseribile ho dei dubbi, nel senso che andrebbe riscritto l'adt.
  • Re: Pila con priorità in C

    bisogna implementare una funzione che elimini le priorità trasformando la struttura dati in base all'ordine di arrivo considerando anche degli elementi già inseriti in coda.
    Bisogna togliere le priorità basta!
    se hai una variabile priorità la azzeri tutto qui.
    Non è difficile se si mantiene un contatore sui nodi e si fa un sorting discendente.
    ti piace renderti la vita difficile?
    
    struct ELEMENT
    {
        int comando,
        int priorita;
    }
    
    struct ELEMENT pila[100];
    int pcount = 0;
    
    void empyprio()
    {
        int i;
        for ( i = 0; i <pcount; ++i ) pila[i].priorita = 0;
    }
    
    in alternativa,come sembra volere il testo dell'esercizio, invece di azzerare la priorità la si copia in in una nuova pila che conterrà la nuova struttura senza priorità, tutta questa operazione può essere fatta in diversi modi, usando una lista invece che un vettore e magari creare l'elemento con un parametro un puntatore void che conterrà a seconda dei casi o la struttura con la priorità oppure no. In questo modo dovremmo gestire solo un tipo di pila e non due.
    Ovviamente è facoltativo, il mio era solo un consiglio ci mancherebbe altro. Che sia facilmente inseribile ho dei dubbi, nel senso che andrebbe riscritto l'adt.
    ecco cosa dovresti inserire nel frammento del codice sopra citato:
    
    //indicizzo il primo elemento con priorità bassa
    #ifdef PRIOHEAP
    int priolow = 0;
    #endif
    
    void push(int comando, int priorita)
    {
        int i;
        int fl = 0;
    
        if (priorita == LOW)
        { 
             #ifdef PRIOHEAP
                 fl = priolow
             #else
                 for(fl = 0; fl < pcount; ++fl) 
                     if (pila[i.]priorita = LOW ) break;
             #endif
         }
         #ifdef PRIOHEAP
         else
         {
              ++priolow;
         }
         #endif
    
         for(i = pcount; i > fl; --i) 
         {
            pila[i].comando = pila[i-1].comando;
            pila[i.]priorita = pila[i-1].priorita;
         }
    
         pila[0].comando = comando;
         pila[0].priorita = priorita;
         ++pcount;
    }
    
    qesto è solo un semplicissimo esempio per farti vedere le piccole modifiche al codice da fare...
    Naturalmente si potrebbe usare anche uno stack normale con inserimento dal fondo o ancora piu semplicemente una lista che richiederebbe meno sforzo per l'inserimento dei dati all'interno della pila stessa.In quest'ultimo caso naturalmente prioheap sarebbe di tipo struct ELEMENT*.
    Non volendo dare della pappa pronta ho quindi ritenuto di postare l'esempio sul caso meno probabilmente usato.
  • Re: Pila con priorità in C

    Questi gli elementi da inserire in coda con la relativa priorità, l'ordine di scrittura è anche quello di arrivo:
    pippo 4
    pluto 2
    paperino 5
    minny 3
    Nella coda a priorità massima avrai:
    paperino 5
    pippo 4
    minny 3
    pluto 2
    Diciamo che estrai il primo nella coda resta:
    pippo 4
    minny 3
    pluto 2
    Se devi togliere le priorità mantenendo l'ordine di arrivo dovrai avere:
    pippo 4
    pluto 2
    minny 3
    Come fai a ricordarti dell'ordine di arrivo?

    Adesso, forse te lo ripeto non è necessario per l'esercizio in questione, perchè è probabile che interpreti io in maniera errata il problema.

    Per quanto riguarda invece la struttura heap, non mi sembra che le scansioni lineari del vettore rispecchino proprio una struttura ad heap.
    Te lo ripeto il mio era un suggerimento, nulla di più.
  • Re: Pila con priorità in C

    Nel testo in effetti non si capisce bene e l ho riletto tante volte...

    Qui hai solo 2 priorità e mentre la priorità alt è sempre messa in testa la più bassa invece va a posizionarsi sopra alla prima di pari priorità indi per cui basta una variabile che ti indichi dove sia e togli ogni sorta di cliclo, è un heap decisamente molto ristretto, valido solo perché le regole sono molto elementari
Devi accedere o registrarti per scrivere nel forum
8 risposte