titre
la mise en œuvre de file d'attente en utilisant la pile suivante:
push (x) - x éléments dans la pile
pop () - enlever la partie supérieure de l'empilement
supérieur () - Obtient l'élément de haut
vide () - Renvoie la pile est vide
Note:
Vous ne pouvez utiliser le fonctionnement de base de la file d' attente - qui est, pousser à dos, coup d' oeil / pop de l' avant, la taille, et est vide de ces opérations sont légales.
La langue que vous utilisez peut ne pas supporter la file d' attente. Vous pouvez utiliser la liste ou deque (deque) pour simuler une file d' attente, la file d' attente aussi longtemps que l'opération à la norme.
Vous pouvez supposer que toutes les opérations sont valides (par exemple, une pile vide ne remet pas l'opération pop ou supérieure).
pensée
- Après que la pile est avancée hors de la file d'attente FIFO est. Lorsque l'opération pop () dans le dernier élément de la pop-up. Ainsi, lorsque nous utilisons lorsque la file d'attente pour les opérations pop () simulent besoin de faire la queue élément pop jusqu'à ce que le dernier chiffre, la nécessité ci-dessus pour enregistrer un pop numérique une autre file d'attente.
- Préparer deux files d'attente et q2 q1.
- pousser:
- Q1 et Q2 qui contrôle de file d'attente est vide pas, les éléments de poussée dans la file d'attente se vident pas.
- Parce que les éléments de poussée sont certainement dans le dernier élément qui est dans l'élément supérieur de la pile, donc définir une variable topVal pour sauver cet élément.
- pop:
- pop opération nécessite l'élément dans le dernier mis au rebut, de sorte que l'élément file d'attente par la file d'attente non vide à nouveau dans une autre file d'attente.
- Lorsque l'élément avant-dernier de la file d'attente quand il est la partie supérieure de la valeur de pop-up après le dernier élément, la mise à jour topVal.
- Lorsque le dernier élément de la file d'attente, la file d'attente ne se laisse pas dans l'autre, complétant ainsi l'opération pop ().
- haut (): retourne la valeur topVal.
- empty (): pour voir si les deux files d'attente sont vides.
code
class MyStack {
private:
queue<int> q1, q2; // 两个队列配合工作
int topVal; // 保存栈顶值
public:
/** Initialize your data structure here. */
MyStack() {
topVal = 0;
}
/** Push element x onto stack. */
void push(int x) {
topVal = x;
if ( q1.empty() ) // 每次只有一个队列不为空。
q2.push( x );
else
q1.push( x );
return;
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
int temp = 0;
if ( q1.empty() ) { // 如果q1为空,说明元素都在q2中。
while ( !q2.empty() ) { // q2的元素逐个出队列。
temp = q2.front();
q2.pop();
if ( q2.size() == 1 ) // 如果q2中只剩一个值,则上一个出队列的元素将为之后栈的顶点元素。
topVal = temp;
if ( !q2.empty() ) // 如果队列为空,则说明最后一个元素已经出队列,此时这个应该被pop出去的元素不进q1。
q1.push( temp );
}
}
else {
while ( !q1.empty() ) {
temp = q1.front();
q1.pop();
if ( q1.size() == 1 )
topVal = temp;
if ( !q1.empty() )
q2.push( temp );
}
}
return temp;
}
/** Get the top element. */
int top() {
return topVal;
}
/** Returns whether the stack is empty. */
bool empty() {
return q1.empty() && q2.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/