Enlace de tema
Descripción del Título:
Implemente una cola con dos pilas. La siguiente cola de instrucciones, implementa sus dos funciones appendTail
y deleteHead
, respectivamente, para completar la inserción y eliminación del entero entero en la cola de la cola en la cabecera de la función de cola. (Si no hay ningún elemento en la cola, la deleteHead
operación devuelve -1)
Ejemplo 1:
Entrada:
["CQueue", "appendTail", "deleteHead", "deleteHead"]
[[], [3], [], []]
Salida: [null, null, 3, -1]
Ejemplo 2:
Entrada:
["CQueue", "deleteHead", "appendTail", "appendTail", "deleteHead", "deleteHead"]
[[], [], [5], [2], [], []]
Salida: [nulo, -1, nulo, nulo, 5,2]
Ideas para resolver problemas
Primero, comprenda el significado de la matriz de cadenas del ejemplo dado por el título: CQueue
inicializar, appendTail
poner en cola, deleteHead
quitar de la cola y devolver el elemento quitado de la cola. En otras palabras, la matriz de cadenas es la instrucción para registrar la operación, y la matriz de entrada int contiene los elementos que deben ponerse en cola. Preste atención a la matriz de salida aquí, no se refiere al estado de los elementos en la cola actual, solo se refiere al retorno de cada operación, de hecho, solo hay deleteHead
retorno.
El segundo es usar la pila dual para darse cuenta de la idea de ingresar la cola en la cola. Para aclarar las características de estas dos estructuras de datos, la pila es el primero en entrar, el último en salir y la cola es el primero en entrar, primero en salir. Obviamente, una sola pila no puede realizar la puesta en cola y la operación de puesta en cola de la cola, entonces, ¿cómo usar la pila dual? En un ejemplo, 1,2,3
los elementos se colocan secuencialmente en la primera pila input
, esta vez input
desde la parte superior de la pila hasta la parte inferior de la pila de elementos secuencialmente 3,2,1
. Ahora quiero lograr el orden de eliminación de la cola 1,2,3
, sacar los elementos de la primera pila uno por uno y empujarlos a la segunda pila output
. En este momento output
, los elementos desde la parte superior de la pila hasta la parte inferior de 1,2,3
la pila están en orden. Obviamente , el orden de aparición es en este momento 1,2,3
, es decir, la pila dual se utiliza para realizar la operación de cola.
El último es el diseño funcional de las tres funciones.
- El título no requiere que hagamos algo durante la inicialización, por lo que
CQueue
se puede ignorar el constructor ;- Según el ejemplo, encontramos que ingresar al equipo
appendTail
no requiere un valor de retorno, solo ingresar al equipo está bien. Por lo tanto, se puede resolver una línea de código de apilamiento;deleteHead
La operación de sacar de cola requiere un análisis de pérdida, no solo requiere que el elemento sea retirado de la cola, sino que también devuelve el elemento retirado de la cola, y cuando el equipo está vacío, debe devolverse.-1
lógica if-else
- Si
input
youtput
están vacíos, lo que indica que la cola está vacía en este momento, regresa-1
;- De lo contrario, no importa
input
si está vacío o no en este momento , siempre que no estéoutput
vacío, significa queoutput
todavía hay elementos despoblados y se prefiere la operaciónoutput
;- De lo contrario,
output
vacío yinput
no vacío, necesitamosinput
todos los elementos presionadosoutput
y luego operaroutput
.
Ahora proporcione los códigos de versión de C ++ y JavaScript ~
c ++
class CQueue {
public:
CQueue() {
}
void appendTail(int value) {
input.push(value);
}
int deleteHead() {
if(input.empty() && output.empty()) //双栈均为空
return -1;
else if(!output.empty()){
//output栈不为空,说明还有未出队的元素
int result = output.top();
output.pop();
return result;
}
else{
//output栈为空,再执行删除需要input元素出栈入栈
while(!input.empty()){
int value = input.top();
input.pop();
output.push(value);
}
int result = output.top();
output.pop();
return result;
}
}
private:
stack<int> input;
stack<int> output;
};
JavaScript
var CQueue = function() {
this.output = [];
this.input = [];
};
/**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function(value) {
this.input.push(value);
};
/**
* @return {number}
*/
CQueue.prototype.deleteHead = function() {
const {
input, output} = this; //es6 解构赋值
if(!output.length && !input.length){
return -1;
}
else if(output.length){
return output.pop();
}
else{
while(input.length){
output.push(input.pop());
}
return output.pop();
}
};
Si hay errores o no es riguroso, corrígeme, muchas gracias.
Mi blog: http://breadhunter.gitee.io