Στοίβα (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);
}