Un algorithme est un ensemble d'étapes pour résoudre un problème, et une structure de données est un moyen organisé de stocker des données de manière ordonnée. Elles sont essentielles à l'écriture de programmes efficaces. Les types courants d’algorithmes incluent les algorithmes de recherche, de tri et de théorie des graphes. Les types de structure de données incluent des tableaux, des listes chaînées, des piles, des files d'attente et des ensembles. Dans des applications pratiques, la pile peut être utilisée pour résoudre le problème de correspondance entre parenthèses, et la file d'attente peut être utilisée pour résoudre le problème producteur-consommateur.
Les bases de Java aux applications pratiques : applications pratiques des algorithmes et des structures de données
Que sont les algorithmes et les structures de données ?
Un algorithme est un ensemble d'étapes pour résoudre un problème spécifique, tandis qu'une structure de données est une manière organisée de stocker et d'organiser les données. Ils sont essentiels pour écrire des programmes efficaces et puissants.
Types d'algorithmes courants
Types courants de structure de données
Cas pratique :
Utiliser la pile pour résoudre le problème de correspondance des parenthèses
Considérons une chaîne avec différents types de parenthèses, telles que des parenthèses rondes, des crochets carrés et des accolades. Pour vérifier si la chaîne est valide (tous les crochets sont par paires et correspondent correctement), nous pouvons utiliser la pile.
Code Java :
import java.util.Stack; public class BracketMatcher { public static boolean isBalanced(String str) { Stack<Character> stack = new Stack<>(); for (char c : str.toCharArray()) { if (isOpen(c)) { stack.push(c); } else if (isClose(c)) { if (stack.isEmpty() || !isMatch(stack.pop(), c)) { return false; } } } return stack.isEmpty(); } private static boolean isOpen(char c) { return c == '(' || c == '[' || c == '{'; } private static boolean isClose(char c) { return c == ')' || c == ']' || c == '}'; } private static boolean isMatch(char open, char close) { return (open == '(' && close == ')') || (open == '[' && close == ']') || (open == '{' && close == '}'); } public static void main(String[] args) { String str1 = "()[]{}"; String str2 = "([)]"; System.out.println(isBalanced(str1)); // true System.out.println(isBalanced(str2)); // false } }
Utiliser des files d'attente pour résoudre le problème producteur-consommateur
Considérons un thread producteur et consommateur partageant une file d'attente. Les threads producteurs ajoutent des éléments à la file d'attente et les threads consommateurs suppriment des éléments de la file d'attente. Pour garantir la sécurité des threads et éviter les conditions de concurrence, nous pouvons utiliser des files d'attente.
Code Java :
import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumer { private ArrayBlockingQueue<Integer> queue; public ProducerConsumer(int capacity) { queue = new ArrayBlockingQueue<>(capacity); } // 生产者线程 public void produce(int item) { try { queue.put(item); } catch (InterruptedException e) { e.printStackTrace(); } } // 消费者线程 public int consume() { try { return queue.take(); } catch (InterruptedException e) { e.printStackTrace(); return -1; // 作为错误标志 } } public static void main(String[] args) { ProducerConsumer pc = new ProducerConsumer(5); new Thread(() -> { for (int i = 0; i < 10; i++) { pc.produce(i); } }).start(); new Thread(() -> { while (true) { int item = pc.consume(); if (item == -1) { break; // 队列为空 } System.out.println("Consumed: " + item); } }).start(); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!