Struttura dei dati e algoritmi - Stack
Uno stack è un tipo di dati astratto (ADT), comunemente utilizzato nella maggior parte dei linguaggi di programmazione. Si chiama pila poiché si comporta come una pila del mondo reale, ad esempio: un mazzo di carte o una pila di piatti, ecc.
Uno stack del mondo reale consente operazioni solo a un'estremità. Ad esempio, possiamo posizionare o rimuovere una carta o un piatto solo dalla parte superiore della pila. Allo stesso modo, Stack ADT consente tutte le operazioni sui dati solo a un'estremità. In qualsiasi momento, possiamo accedere solo all'elemento superiore di uno stack.
Questa caratteristica rende la struttura dati LIFO. LIFO sta per Last-in-first-out. Qui si accede per primo all'elemento che è stato posizionato (inserito o aggiunto) per ultimo. Nella terminologia dello stack, viene chiamata l'operazione di inserimentoPUSH viene chiamata l'operazione di operazione e rimozione POP operazione.
Rappresentazione in pila
Il diagramma seguente illustra uno stack e le sue operazioni:
Uno stack può essere implementato mediante Array, Structure, Pointer e Linked List. Lo stack può essere di dimensioni fisse o può avere un senso di ridimensionamento dinamico. Qui, implementeremo lo stack utilizzando gli array, il che lo rende un'implementazione dello stack di dimensioni fisse.
Operazioni di base
Le operazioni sullo stack possono comportare l'inizializzazione dello stack, il suo utilizzo e quindi la de-inizializzazione. Oltre a questi elementi di base, uno stack viene utilizzato per le seguenti due operazioni principali:
push() - Spingere (immagazzinare) un elemento sullo stack.
pop() - Rimozione (accesso) di un elemento dalla pila.
Quando i dati vengono inseriti nello stack.
Per utilizzare uno stack in modo efficiente, dobbiamo controllare anche lo stato dello stack. Per lo stesso scopo, la seguente funzionalità viene aggiunta agli stack:
peek() - ottenere l'elemento dati superiore dello stack, senza rimuoverlo.
isFull() - controlla se lo stack è pieno.
isEmpty() - controlla se lo stack è vuoto.
In ogni momento, manteniamo un puntatore agli ultimi dati PUSH nello stack. Poiché questo puntatore rappresenta sempre la parte superiore dello stack, da qui denominatotop. Iltop il puntatore fornisce il valore superiore dello stack senza rimuoverlo effettivamente.
Per prima cosa dovremmo conoscere le procedure per supportare le funzioni dello stack -
sbirciare()
Algoritmo della funzione peek () -
begin procedure peek
return stack[top]
end procedure
Implementazione della funzione peek () nel linguaggio di programmazione C -
Example
int peek() {
return stack[top];
}
è pieno()
Algoritmo della funzione isfull () -
begin procedure isfull
if top equals to MAXSIZE
return true
else
return false
endif
end procedure
Implementazione della funzione isfull () nel linguaggio di programmazione C -
Example
bool isfull() {
if(top == MAXSIZE)
return true;
else
return false;
}
è vuoto()
Algoritmo della funzione isempty () -
begin procedure isempty
if top less than 1
return true
else
return false
endif
end procedure
L'implementazione della funzione isempty () nel linguaggio di programmazione C è leggermente diversa. Inizializziamo top a -1, poiché l'indice nell'array inizia da 0. Quindi controlliamo se il top è sotto zero o -1 per determinare se lo stack è vuoto. Ecco il codice -
Example
bool isempty() {
if(top == -1)
return true;
else
return false;
}
Operazione push
Il processo di inserimento di un nuovo elemento di dati nello stack è noto come operazione push. L'operazione push prevede una serie di passaggi:
Step 1 - Controlla se la pila è piena.
Step 2 - Se lo stack è pieno, produce un errore ed esce.
Step 3 - Se la pila non è piena, aumenta top per indicare il prossimo spazio vuoto.
Step 4 - Aggiunge un elemento di dati alla posizione dello stack, dove punta in alto.
Step 5 - Restituisce il successo.
Se l'elenco collegato viene utilizzato per implementare lo stack, nel passaggio 3 è necessario allocare lo spazio in modo dinamico.
Algoritmo per l'operazione PUSH
Un semplice algoritmo per l'operazione Push può essere derivato come segue:
begin procedure push: stack, data
if stack is full
return null
endif
top ← top + 1
stack[top] ← data
end procedure
L'implementazione di questo algoritmo in C è molto semplice. Vedere il codice seguente -
Example
void push(int data) {
if(!isFull()) {
top = top + 1;
stack[top] = data;
} else {
printf("Could not insert data, Stack is full.\n");
}
}
Operazione Pop
L'accesso al contenuto mentre lo si rimuove dallo stack è noto come operazione Pop. In un'implementazione di matrice dell'operazione pop (), l'elemento data non viene effettivamente rimosso, invecetopviene decrementato in una posizione inferiore nella pila per puntare al valore successivo. Ma nell'implementazione dell'elenco collegato, pop () rimuove effettivamente l'elemento dati e rilascia lo spazio di memoria.
Un'operazione Pop può comportare i seguenti passaggi:
Step 1 - Controlla se la pila è vuota.
Step 2 - Se lo stack è vuoto, produce un errore ed esce.
Step 3 - Se lo stack non è vuoto, accede all'elemento di dati in cui top sta indicando.
Step 4 - Diminuisce il valore di top di 1.
Step 5 - Restituisce il successo.
Algoritmo per l'operazione Pop
Un semplice algoritmo per l'operazione Pop può essere derivato come segue:
begin procedure pop: stack
if stack is empty
return null
endif
data ← stack[top]
top ← top - 1
return data
end procedure
L'implementazione di questo algoritmo in C è la seguente:
Example
int pop(int data) {
if(!isempty()) {
data = stack[top];
top = top - 1;
return data;
} else {
printf("Could not retrieve data, Stack is empty.\n");
}
}
Per un programma stack completo in linguaggio di programmazione C, fare clic qui .