tema:
Implementar una cola con dos pilas. La declaración de la cola es la siguiente, implemente sus dos funciones, appendTail y deleteHead. Complete las funciones de insertar enteros al final de la cola y eliminar enteros al principio de la cola, respectivamente. (Si no hay elementos en la cola, la operación deleteHead devuelve -1).
Ejemplo 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
复制代码
Ejemplo 2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
复制代码
insinuación:
- 1 <= valores <= 10000
- Hará hasta 10000 llamadas a appendTail, deleteHead
Ideas para resolver problemas:
La pila no puede implementar la función de cola: el elemento en la parte inferior de la pila (correspondiente al primer elemento de la cola) no se puede eliminar directamente, y todos los elementos anteriores deben sacarse de la pila.
La pila doble puede realizar el orden inverso de la lista: hay una pila A=[1, 2, 3] con tres elementos y una pila vacía B=[]. Si el elemento A se extrae de la pila y se agrega a la pila B hasta que la pila A está vacía, entonces A = [], B = [3, 2, ], es decir, los elementos de la pila B implementan el orden inverso de los elementos de la pila A.
Usa la pila B para eliminar el primer elemento del equipo: Después del orden inverso, cuando B realiza un popping, es equivalente a eliminar el elemento inferior de la pila de A, es decir, el primer elemento correspondiente del equipo.
Diseño de funciones:
El título solo requiere el funcionamiento normal de las dos funciones: appendTail() al final de la cola y deleteHead() para eliminar la cabeza de la cola. Por lo tanto, podemos diseñar la pila A para agregar la cola de la cola y la pila B para invertir los elementos, a fin de eliminar la cabeza de la cola.
- Agregue la función appendTail() al final de la cola: agregue el número val a la pila A.
- Elimine la función deleteHead() del jefe de equipo: Existen las siguientes tres situaciones.
①Cuando la pila B no está vacía, todavía hay elementos en B que se han invertido, por lo que el elemento superior de la pila de B se devuelve directamente
②De lo contrario, cuando A está vacío, es decir, ambas pilas están vacías y no tienen elementos, por lo que devuelve -1
③ De lo contrario, transfiera todos los elementos de la pila A a la pila B, realice el orden inverso de los elementos y devuelva el elemento superior de la pila B.
Código:
class CQueue {
var stack1: [Int] = []
var stack2: [Int] = []
init() {
}
func appendTail(_ value: Int) {
stack1.append(value)
}
func deleteHead() -> Int {
if stack2.isEmpty {
while let item = stack1.popLast() {
stack2.append(item)
}
}
return stack2.popLast() ?? -1
}
}
复制代码