用两个队列实现一个栈
1.入栈
入队的时候看哪个栈队列为空则给哪个入队。
public static void enterStack(QueueLink q1,QueueLink q2,int val){ QueueLink p = null; if(!q1.isEmpty()){ p = q1; }else{ p = q2; } p.push(val);; }
2.出栈
每次使p1指向要出队的队列,p2指向一个空队列,为要入队的队列,将p1依次出队,p1的值依次入队到p2中,直到p1中只剩一个元素,出队即可,队列p1最后出队的值就是最后入队的值,也就符合了栈先进后出的特点。
public static int pop(QueueLink q1,QueueLink q2){ QueueLink p1 = null;//永远指向出队的队列 QueueLink p2 = null;//永远指向出队后的元素需要放置的位置。 if(!q1.isEmpty()){ p1 = q1; p2 = q2; }else{ p1 = q2; p2 = q1; } //确认好出队的队列以及将来需要把出队后放在什么地方。 //开始出队。 int num = -1; if(p1.isEmpty()){ return -1; }else{ //出元素,只剩下一个。 while(p1.getSize() > 1){ num = p1.pop();//把p1指向的队列出队只剩一个元素。 p2.push(num);//把p1的元素依次放入p2中。 } } return p1.pop(); }
3.测试结果
public static void main(String[] args) { QueueLink q1 = new QueueLink(); QueueLink q2 = new QueueLink(); enterStack(q1,q2,1); enterStack(q1,q2,3); enterStack(q1,q2,5); enterStack(q1,q2,2); enterStack(q1,q2,4); System.out.println(pop(q1,q2)); System.out.println(pop(q1,q2)); System.out.println(pop(q1,q2)); System.out.println(pop(q1,q2)); System.out.println(pop(q1,q2)); }