Il n'y a pas de structures de données liées aux files d'attente et aux piles dans le langage Go ; cependant, les opérations de pile et de file d'attente peuvent être implémentées à l'aide de tranches. Le langage Go implémente les piles et les files d'attente principalement en utilisant l'ajout et le découpage (fonctionnant avec des types de tableaux intégrés). La syntaxe de création de piles et de files d'attente est "make([]int, 0)", et la syntaxe de poussée dans les piles et les files d'attente est. "append(stack, 10)", la syntaxe pour ouvrir la pile est "v:=stack[len(stack)-1] stack = stack[:len(stack)-1]".
L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.
Dans le langage Go, il n'y a pas de structures de données liées aux piles et aux files d'attente, mais nous pouvons utiliser le slicing pour implémenter des opérations sur les piles et les files d'attente. Ensuite, nous implémenterons des opérations de base sur les piles et les files d'attente, et également implémenter. use La pile implémente la file d'attente , et utilise la file d'attente pour implémenter les opérations de la pile .
Le langage Go utilise principalement l'ajout et le slice (fonctionnant avec des types de tableaux intégrés) pour implémenter les piles et les files d'attente
//创建栈 stack := make([]int, 0) //push压入栈 stack = append(stack, 10) //pop弹出 v := stack[len(stack)-1] stack = stack[:len(stack)-1] //检查栈空 len(stack) == 0
//创建队列 queue := make([]int, 0) //enqueue入队 queue = append(queue, 10) //dequeue出队 v := queue[0] queue = queue[1:] //检查队列为空 len(queue) == 0
Utilisez la pile pour modéliser le comportement de la file d'attente Si vous n'utilisez qu'une seule pile, cela ne fonctionnera certainement pas, vous en avez donc besoin de deux. piles, une pile d'entrée et une pile de sortie, nous devons ici prêter attention à la relation entre la pile d'entrée et la pile de sortie.
L'animation ci-dessous simule le processus d'exécution de la file d'attente suivante comme suit :
Instruction d'exécution :
queue.push(1); queue.push(2); queue.pop(); 注意此时的输出栈的操作 queue.push(3); queue.push(4); queue.pop(); queue.pop();注意此时的输出栈的操作 queue.pop(); queue.empty();
Lors du transfert de données, tant que les données sont placées dans la pile d'entrée, mais lors du popping, l'opération est plus compliquée. Si la pile de sortie est vide, importez toutes les données push dans la pile (notez que toutes les données sont importées), puis extrayez les données de la pile pop. Si la pile de sortie n'est pas vide, extrayez simplement les données. directement depuis la pile pop.
Comment déterminer si la file d'attente est finalement vide ? Si push et pop sont vides, cela signifie que la file d'attente simulée est vide.
Jetons un coup d'œil à la question originale de LeetCode
232 Utiliser des piles pour implémenter les files d'attente
Veuillez n'utiliser que deux piles pour implémenter les files d'attente premier entré, premier sorti. La file d'attente doit prendre en charge toutes les opérations (push, pop, peek, vide) prises en charge par les files d'attente générales :
Implémentez la classe MyQueue :
void push(int x) Poussez l'élément x à la fin de la file d'attente int pop() supprime et renvoie un élément du début de la file d'attente int peek() renvoie l'élément au début de la file d'attente boolean empty() renvoie true si la file d'attente est vide, sinon renvoie false ; Remarque :
Vous ne pouvez utiliser que des opérations de pile standard - c'est-à-dire que seules les opérations pousser vers le haut, jeter un coup d'œil/pop depuis le haut, tailler et vider sont légales. Le langage que vous utilisez peut ne pas prendre en charge les piles. Vous pouvez utiliser une liste ou un deque (file d'attente à double extrémité) pour simuler une pile, à condition qu'il s'agisse d'une opération de pile standard.
Pour résoudre ce problème, vous avez besoin d'une pile de sortie et d'une pile d'entrée
Placez d'abord les données dans la pile d'entrée, puis placez les données de la pile d'entrée dans la pile de sortie. le temps, l'ordre des données de sortie de la pile de sortie est C'est le même que la file d'attente, premier entré, premier sorti
type MyQueue struct { stackIn []int // 用来保存Push数据 stackOut []int // 用来保存Pop数据 } // 栈构造器 func Constructor() MyQueue { return MyQueue{ stackIn: make([]int, 0), stackOut: make([]int, 0), } } func (this *MyQueue) Push(x int) { // 判断stackOut中是否有元素,有的话全部放到stackIn for len(this.stackOut) != 0 { val := this.stackOut[len(this.stackOut)-1] this.stackOut = this.stackOut[:len(this.stackOut)-1] this.stackIn = append(this.stackIn, val) } // 将数据加进stackIn this.stackIn = append(this.stackIn, x) } func (this *MyQueue) Pop() int { // 判断stackIn中是否有元素,有的话全部放到stackOut for len(this.stackIn) != 0 { val := this.stackIn[len(this.stackIn)-1] this.stackIn = this.stackIn[:len(this.stackIn)-1] this.stackOut = append(this.stackOut, val) } // stackOut为零,说明没有元素,return 0 if len(this.stackOut) == 0 { return 0 } // stackOut Pop 元素 res := this.stackOut[len(this.stackOut)-1] this.stackOut = this.stackOut[:len(this.stackOut)-1] return res } func (this *MyQueue) Peek() int { // 调用Pop()方法 val := this.Pop() // val为零,说明没有元素,return 0 if val == 0 { return 0 } // Pop()方法删除了val,这里加上 this.stackOut = append(this.stackOut, val) return val } func (this *MyQueue) Empty() bool { // 两个栈都为空,说明为空,否则不为空 return len(this.stackOut) == 0 && len(this.stackIn) == 0 }
Le code peut être directement exécuté sur Likou. J'ai expliqué tous les détails dans les commentaires. Si vous ne comprenez pas, vous pouvez envoyer un message privé au blogueur.
La file d'attente simule des piles. En fait, une file d'attente suffit, parlons donc d'abord de l'idée de deux files d'attente pour implémenter des piles.
La file d'attente est une règle du premier entré, premier sorti. Lorsque les données d'une file d'attente sont importées dans une autre file d'attente, l'ordre des données ne change pas et il ne devient pas un ordre premier entré, dernier sorti.
Donc, l'idée d'utiliser une pile pour implémenter une file d'attente est différente de l'utilisation d'une file d'attente pour implémenter une pile, selon la nature de ces deux structures de données.
Mais nous devons quand même utiliser deux files d'attente pour simuler la pile, mais il n'y a pas de relation entre l'entrée et la sortie, mais une autre file d'attente est entièrement utilisée pour la sauvegarde !
Comme le montre l'animation ci-dessous, deux files d'attente que1 et que2 sont utilisées pour implémenter la fonction de file d'attente. que2 est en fait une fonction de sauvegarde. Elle sauvegarde tous les éléments sauf le dernier élément de que1 dans que2, puis extrait le dernier élément. . Importez ensuite les autres éléments de que2 vers que1.
L'instruction d'exécution de file d'attente simulée est la suivante :
queue.push(1); queue.push(2); queue.pop(); // 注意弹出的操作 queue.push(3); queue.push(4); queue.pop(); // 注意弹出的操作 queue.pop(); queue.pop(); queue.empty();