Στοίβα (stack)
Η στοίβα είναι μια συλλογή δεδομένων με γραμμική διάταξη στην οποία όλες οι εισαγωγές και οι διαγραφές γίνονται στο ένα άκρο που λέγεται κορυφή (top) της στοίβας (LIFO)
Παράδειγμα
Υλοποίηση με πίνακα
#include <stdio.h> #include <stdlib.h> //ορίζω μέγιστο πλήθος για τη στοίβα #define MAX 10 //ορίζω έναν τύπο δεδομένων με όνομα UINT typedef unsigned int UINT; //ορίζω ένα struct με όνομα STACK typedef struct { int index; UINT data[MAX]; } STACK; //Συνάρτηση αρχικοποίησης, καλείται πρώτη πριν από όποια άλλη void create(STACK *t) { t->index = -1; } //Ελέγχει αν η στοίβα είναι άδεια, επιστρέφει 1 ή 0 int isEmpty(STACK t) { if(t.index == -1) return 1; else return 0; } //Ελέγχει αν η στοίβα είναι γεμάτη, επιστρέφει 1 ή 0 int isFull(STACK t) { if(t.index == MAX-1) return 1; else return 0; } //Εκτυπώνει τη στοίβα void printStack(STACK t) { int i; for(i=0; i<=t.index; i++) { printf("%d ", t.data[i]); } printf("\n"); } //Επιστρέφει την τιμή του δείκτη (index) UINT getIndex(STACK t) { return t.index; } //Επιστρέφει το top στοιχείο της στοίβας αλλά δεν το αφαιρεί int getTop(STACK t) { return t.data[t.index]; } //Προσθέτει ένα στοιχείο τύπου UINT στη στοίβα void push(STACK *t, UINT e) { t->index++; t->data[t->index] = e; } //Αφαιρεί το επάνω στοιχείο της στοίβας (αυτό που δείχνει ο δείκτης index) void pop(STACK *t) { t->index--; } int main() { STACK stack; UINT temp; //Δημιουργία στοίβας create(&stack); int x = 0; do { //system("clear"); //system("cls"); printf("1. Push\n"); printf("2. Pop\n"); printf("3. Is Empty\n"); printf("4. Is Full\n"); printf("5. Get Index\n"); printf("6. Get Top\n"); printf("7. Print Stack\n"); printf("0. Exit\n"); printf("select option: "); scanf("%d", &x); if(x==0) break; if(x==1) { if(isFull(stack)) { printf("oops, sorry the stack is full\n"); } else { printf("give number: "); scanf("%d", &temp); push(&stack, temp); printf("%d was pushed\n", temp); } } if(x==2) { if(isEmpty(stack)) { printf("oops, sorry the stack is empty\n"); } else { pop(&stack); printf("top item was popped\n"); } } if(x==3) { if(isEmpty(stack)) printf("the stack is empty\n"); else printf("the stack is not empty\n"); } if(x==4) { if(isFull(stack)) printf("the stack is full\n"); else printf("the stack is not full\n"); } if(x==5) { if(!isEmpty(stack)) printf("index: %d: \n", getIndex(stack)); else printf("oops, the stack is empty\n"); } if(x==6) { if(isEmpty(stack)) printf("oops, the stack is empty\n"); else printf("top item: %d: \n", getTop(stack)); } if(x==7) { if(!isEmpty(stack)) printStack(stack); else printf("oops, the stack is empty\n"); } printf("------------------------------\n"); } while(x != 0); }