Je vais tenter une démonstration pour montrer que c'est impossible.
Suppose there is a queue Q that is simulated by 3 stacks, A, B and C.
Assertions
ASRT0 := Furthermore, assume that Q can simulate operations {queue,dequeue} in O(1). This means that there exists a specific sequence of stack push/pops for every queue/dequeue operation to be simulated.
Without loss of generality
WLOG0, assume the queue operations are deterministic
Let the elements queued into Q be numbered 1, 2, ..., based on their order of queue, with the first element that is queued into Q being defined as 1, the second one as 2, and so on.
Define
Q(0) := The state of Q when there are 0 elements in Q (and thus 0 elements in A, B and C)
Q(1) := The state of Q (and A, B and C) after 1 queue operation on Q(0)
Q(n) := The state of Q (and A, B and C) after n queue operations on Q(0)
Define
|Q(n)| := the number of elements in Q(n) (therefore |Q(n)| = n)
A(n) := the state of the stack A when the state of Q is Q(n)
|A(n)| := be the number of elements in A(n)
And similar definitions for stacks B and C.
Trivially,
|Q(n)| = |A(n)| + |B(n)| + |C(n)|
---
|Q(n)| is obviously unbounded on n.
Therefore, at least one of |A(n)|, |B(n)| or |C(n)| is unbounded on n.
WLOG1, suppose stack A is unbounded and stacks B and C are bounded.
Define
B_u := an upper bound of B
C_u := an upper bound of C
K := B_u + C_u + 1
WLOG2, for an n such that |A(n)| > K, select K elements from Q(n). Suppose that 1 of those elements is in A(n + x), for all x >= 0, i.e. the element is always in stack A no matter how many queue operations are done.
X := that element
Then we can define
Abv(n) := the number of items in stack A(n) that is above X
Blo(n) := the number of elements in stack A(n) that is below X
|A(n)| = Abv(n) + Blo(n)
ASRT1 := The number of pops required to dequeue X from Q(n) is at least Abv(n)
From (ASRT0) and (ASRT1),
ASRT2 := Abv(n) must be bounded.
If Abv(n) is unbounded, then if 20 dequeues are required to dequeue X from Q(n), it will require at least Abv(n)/20 pops. Which is unbounded. 20 can be any constant.
Therefore,
ASRT3 := Blo(n) = |A(n)| - Abv(n)
must be unbounded.
--- ---
WLOG3, we can select the K elements from the bottom of A(n), and one of them is in A(n + x) for all x >= 0
X(n) := that element, for any given n
ASRT4 := Abv(n) >= |A(n)| - K
Whenever an element is queued into Q(n)...
WLOG4, suppose B and C are already filled to their upper bounds. Suppose that the upper bound for elements above X(n) has been reached. Then, a new element enters A.
WLOG5, suppose that as a result, the new element must enter below X(n).
ASRT5 := The number of pops required to put an element below X(n) >= Abv(X(n))
From (ASRT4), Abv(n) is unbounded on n.
Therefore, the number of pops required to put an element below X(n) is unbounded.
---
This contradicts ASRT1, therefore, it is not possible to simulate an O(1) queue with 3 stacks.
I.e.
Au moins une pile doit être non limitée.
Pour un élément qui reste dans cette pile, le nombre d'éléments au-dessus de lui doit être limité, sinon l'opération de dequeue pour retirer cet élément ne sera pas limitée.
Cependant, si le nombre d'éléments au-dessus de lui est limité, il atteindra une limite. À un moment donné, un nouvel élément doit entrer en dessous.
Puisque nous pouvons toujours choisir l'ancien élément parmi les quelques éléments les plus bas de cette pile, il peut y avoir un nombre illimité d'éléments au-dessus de lui (sur la base de la taille illimitée de la pile illimitée).
Pour introduire un nouvel élément en dessous, puisqu'il y a un nombre illimité d'éléments au-dessus, un nombre illimité de pops est nécessaire pour placer le nouvel élément en dessous.
Et donc la contradiction.
Il existe 5 déclarations WLOG (Without loss of generality). Dans un certain sens, on peut comprendre intuitivement qu'elles sont vraies (mais étant donné qu'elles sont au nombre de 5, cela peut prendre un certain temps). La preuve formelle qu'aucune généralité n'est perdue peut être dérivée, mais elle est extrêmement longue. Elles sont omises.
J'admets qu'une telle omission pourrait laisser les déclarations du WLOG en question. Avec la paranoïa du programmeur pour les bugs, veuillez vérifier les déclarations WLOG si vous le souhaitez.
La troisième pile n'est pas non plus pertinente. Ce qui compte, c'est qu'il y a un ensemble de piles limitées et un ensemble de piles non limitées. Le minimum requis pour un exemple est de 2 piles. Le nombre de piles doit, bien entendu, être fini.
Enfin, si j'ai raison de dire qu'il n'y a pas de preuve, alors une preuve inductive plus facile devrait être disponible. Probablement en se basant sur ce qui se passe après chaque file d'attente (suivre comment cela affecte le pire cas de dequeue étant donné l'ensemble de tous les éléments de la file d'attente).