Structure et implémentation des données de pile en Python, Java et C / C ++

Dans ce didacticiel, vous découvrirez la structure de données de la pile et son implémentation en Python, Java et C / C ++.

Une pile est une structure de données utile en programmation. C'est comme une pile d'assiettes placées les unes sur les autres.

Représentation de la pile semblable à une pile de plaque

Pensez aux choses que vous pouvez faire avec un tel tas d'assiettes

  • Mettez une nouvelle assiette sur le dessus
  • Retirez la plaque supérieure

Si vous voulez que la plaque soit en bas, vous devez d'abord retirer toutes les plaques du dessus. Un tel arrangement est appelé Last In First Out - le dernier élément qui est le premier élément à sortir.

Principe de pile LIFO

En termes de programmation, placer un élément au-dessus de la pile est appelé push et supprimer un élément est appelé pop .

Empiler les opérations Push et Pop

Dans l'image ci-dessus, bien que l'élément 2 ait été conservé en dernier, il a été supprimé en premier - il suit donc le principe du dernier entré, premier sorti (LIFO) .

Nous pouvons implémenter une pile dans n'importe quel langage de programmation comme C, C ++, Java, Python ou C #, mais la spécification est à peu près la même.

Opérations de base de la pile

Une pile est un objet (un type de données abstrait - ADT) qui permet les opérations suivantes:

  • Pousser : ajouter un élément au sommet d'une pile
  • Pop : supprimer un élément du haut d'une pile
  • IsEmpty : Vérifiez si la pile est vide
  • IsFull : vérifie si la pile est pleine
  • Coup d'oeil : obtenez la valeur de l'élément supérieur sans le supprimer

Fonctionnement de la structure de données de la pile

Les opérations fonctionnent comme suit:

  1. Un pointeur appelé TOP est utilisé pour garder une trace de l'élément supérieur de la pile.
  2. Lors de l'initialisation de la pile, nous fixons sa valeur à -1 afin de pouvoir vérifier si la pile est vide en comparant TOP == -1.
  3. En poussant un élément, nous augmentons la valeur de TOP et plaçons le nouvel élément dans la position pointée par TOP.
  4. En sautant un élément, nous retournons l'élément pointé par TOP et réduisons sa valeur.
  5. Avant de pousser, on vérifie si la pile est déjà pleine
  6. Avant de sauter, nous vérifions si la pile est déjà vide
Fonctionnement de la structure de données de la pile

Implémentations de pile en Python, Java, C et C ++

L'implémentation de pile la plus courante utilise des tableaux, mais elle peut également être implémentée à l'aide de listes.

Python Java C C +
 # Stack implementation in python # Creating a stack def create_stack(): stack = () return stack # Creating an empty stack def check_empty(stack): return len(stack) == 0 # Adding items into the stack def push(stack, item): stack.append(item) print("pushed item: " + item) # Removing an element from the stack def pop(stack): if (check_empty(stack)): return "stack is empty" return stack.pop() stack = create_stack() push(stack, str(1)) push(stack, str(2)) push(stack, str(3)) push(stack, str(4)) print("popped item: " + pop(stack)) print("stack after popping an element: " + str(stack)) 
 // Stack implementation in Java class Stack ( private int arr(); private int top; private int capacity; // Creating a stack Stack(int size) ( arr = new int(size); capacity = size; top = -1; ) // Add elements into stack public void push(int x) ( if (isFull()) ( System.out.println("OverFlowProgram Terminated"); System.exit(1); ) System.out.println("Inserting " + x); arr(++top) = x; ) // Remove element from stack public int pop() ( if (isEmpty()) ( System.out.println("STACK EMPTY"); System.exit(1); ) return arr(top--); ) // Utility function to return the size of the stack public int size() ( return top + 1; ) // Check if the stack is empty public Boolean isEmpty() ( return top == -1; ) // Check if the stack is full public Boolean isFull() ( return top == capacity - 1; ) public void printStack() ( for (int i = 0; i <= top; i++) ( System.out.println(arr(i)); ) ) public static void main(String() args) ( Stack stack = new Stack(5); stack.push(1); stack.push(2); stack.push(3); stack.push(4); stack.pop(); System.out.println("After popping out"); stack.printStack(); ) )
 // Stack implementation in C #include #include #define MAX 10 int count = 0; // Creating a stack struct stack ( int items(MAX); int top; ); typedef struct stack st; void createEmptyStack(st *s) ( s->top = -1; ) // Check if the stack is full int isfull(st *s) ( if (s->top == MAX - 1) return 1; else return 0; ) // Check if the stack is empty int isempty(st *s) ( if (s->top == -1) return 1; else return 0; ) // Add elements into stack void push(st *s, int newitem) ( if (isfull(s)) ( printf("STACK FULL"); ) else ( s->top++; s->items(s->top) = newitem; ) count++; ) // Remove element from stack void pop(st *s) ( if (isempty(s)) ( printf(" STACK EMPTY "); ) else ( printf("Item popped= %d", s->items(s->top)); s->top--; ) count--; printf(""); ) // Print elements of stack void printStack(st *s) ( printf("Stack: "); for (int i = 0; i items(i)); ) printf(""); ) // Driver code int main() ( int ch; st *s = (st *)malloc(sizeof(st)); createEmptyStack(s); push(s, 1); push(s, 2); push(s, 3); push(s, 4); printStack(s); pop(s); printf("After popping out"); printStack(s); )
 // Stack implementation in C++ #include #include using namespace std; #define MAX 10 int size = 0; // Creating a stack struct stack ( int items(MAX); int top; ); typedef struct stack st; void createEmptyStack(st *s) ( s->top = -1; ) // Check if the stack is full int isfull(st *s) ( if (s->top == MAX - 1) return 1; else return 0; ) // Check if the stack is empty int isempty(st *s) ( if (s->top == -1) return 1; else return 0; ) // Add elements into stack void push(st *s, int newitem) ( if (isfull(s)) ( printf("STACK FULL"); ) else ( s->top++; s->items(s->top) = newitem; ) size++; ) // Remove element from stack void pop(st *s) ( if (isempty(s)) ( printf(" STACK EMPTY "); ) else ( printf("Item popped= %d", s->items(s->top)); s->top--; ) size--; cout << endl; ) // Print elements of stack void printStack(st *s) ( printf("Stack: "); for (int i = 0; i < size; i++) ( cout 

Stack Time Complexity

For the array-based implementation of a stack, the push and pop operations take constant time, i.e. O(1).

Applications of Stack Data Structure

Although stack is a simple data structure to implement, it is very powerful. The most common uses of a stack are:

  • To reverse a word - Put all the letters in a stack and pop them out. Because of the LIFO order of stack, you will get the letters in reverse order.
  • In compilers - Compilers use the stack to calculate the value of expressions like 2 + 4 / 5 * (7 - 9) by converting the expression to prefix or postfix form.
  • In browsers - The back button in a browser saves all the URLs you have visited previously in a stack. Each time you visit a new page, it is added on top of the stack. When you press the back button, the current URL is removed from the stack, and the previous URL is accessed.

Articles intéressants...