面试中经常出现手写两个队列实现一个堆栈,两个堆栈实现一个队列的问题,很头疼。 今天我仔细分析,给你看我想的Java代码。 (一个)两个队列实现一个堆栈。
将元素添加到两个队列中。 哪个队列为空,是为了在输出元素时移动对应的元素(末尾的元素除外),在非空队列中添加元素。 输出数据时,请对两个队列执行相变操作,将非空队列按顺序添加到空队列中,直到输出最后一个元素。
//*
*两个队列实现一个堆栈
* @auther gjdxbw
* @date 2019/7/18
*/
公共类twoqueueimplstack {
私密性queuequeue1=new array deque (;
私密性queuequeue2=new array deque (;
//*
*将数据压入堆栈
* @param element
*/
公共语音推送(集成器元件) {
//如果两个队列为空,则优先队列1
if(queue1.isempty () queue2.isEmpty () )。
queue1.添加(元素);
返回;
}
如果queue1为空,则queue2中有数据,可以直接放入queue2
if(queue1.isempty () ) ) ) )。
queue2.添加(元素);
返回;
}
如果queue1为空,则queue2中有数据,可以直接放入queue2
if(queue2.isempty () ) ) ) )。
queue1.添加(元素);
返回;
}
}
//*
*取出堆栈中的数据
* @return
*/
公共集成器轮询
//如果两个队列为空,则直接抛出异常
if(queue1.isempty () queue2.isEmpty () )。
thrownewruntimeexception (堆栈信息);
}
如果//queue1为空,则将queue2的元素依次添加到queue1中,然后弹出最后一个元素
if(queue1.isempty () ) ) ) )。
wile(queue2.size ) )1) {
队列1 .添加(队列2 .轮询);
}
返回队列2.poll (;
}
如果//queue2为空,则将queue1的元素依次添加到queue2中,然后弹出最后一个元素
if(queue2.isempty () ) ) ) )。
wile(queue1.size ) )1) {
队列2 .添加(队列1 .轮询);
}
返回队列1.poll (;
}
返回空值;
}
publicstaticvoidmain (字符串[ ] args ) {
twoqueueimplstackqs=newtwoqueueimplstack (;
QS.push(2;
QS.push(4;
QS.push(7;
QS.push(5;
系统. out.println (QS.poll ) );
系统. out.println (QS.poll ) );
QS.push(1;
系统. out.println (QS.poll ) );
}
}
输出结果:
(二)两个堆栈实现一个队列:
第一个堆栈只负责添加元素,第二个堆栈在弹出元素时,首先判断当前堆栈是否为空,如果为空,则将第一个堆栈的数据直接推入第二个堆栈,输出堆栈的第一个元素,从而实现排队效果; 如果第二个堆栈中有数据,直接将该数据推入第一个堆栈,输出时直接输出第二个堆栈顶部的元素即可!
//*
*在两个堆栈上实现一个队列
* @auther gjdxbw
* @date 2019/7/18
*/
公共类twostackimplqueue {
私密堆栈1=new stack (;
私密堆栈2=new stack (;
//*
*堆栈1只负责队列要素的压入
* @param element
*/
公共语音推送(集成器元件) {
sack1.添加(元素;
}
//*
*取出队列顶部的元素
* @return
*/
公共集成器轮询
//堆叠2为空时,将堆叠1中的元素推入堆叠2
if (堆叠2.isempty () ) ) )。
wile (堆栈1.size ) )0) {
堆叠2 .添加(堆叠1.pop ) );
}
}
if (堆叠2.isempty () ) ) )。
thrownewruntimeexception (' queue isempty!' );
}
Integer head=stack2.pop (;
返回头;
}
publicstaticvoidmain (字符串[ ] args ) {
twostackimplqueuesq=newtwostackimplqueue (;
sq.push(1;
sq.push(3;
sq.push(5;
sq.push(4;
sq.push(2;
系统. out.println (sq.poll ) );
系统. out.println (sq.poll ) );
sq.push(7;
系统. out.println (sq.poll ) );
}
}
输出结果:
请每天一点点进步,加油……。