1、问题描述:栈是先入后出的数据结构,而队列是先入先出的数据结构,要求用两个数据栈实现数据的先入先出,即队列。
在数据栈的包内实现:
public class StackToQueue{
public static void entryQueue(Stack s1, int val){
// s1保存数据
s1.push(val);
}
public static int popQueue(Stack s1, Stack s2){
int num = -1;
if (s2.isEmpty()){
// 把s1栈顶的值依次出栈到s2
while (!s1.isEmpty()){
num = s1.getTop();
s2.push(num);
// s1栈顶元素的变化
s1.pop();
}
}
int num2 = -1;
// s1全部出栈后取s2的栈顶元素,就是队列的头
if (!s2.isEmpty()){
num2 = s2.getTop();
s2.pop();
}else{
System.out.println("出队完毕");
}
return num2;
}
public static void main(String[] args) {
Stack s1 = new Stack();
Stack s2 = new Stack();
entryQueue(s1,10);
entryQueue(s1,20);
entryQueue(s1,120);
s1.printf();
System.out.println("队列头是" + popQueue(s1,s2));
System.out.print("出队后的数据是: ");
s2.printf();
}
}
输出结果是:
10 20 120
队列头是10
出队后的数据是: 120 20
2、问题描述:要求用两个队列实现先入后出功能,即栈。
在数据栈的包内实现:
public class QueueToStack {
public static void enter(Queue q1, Queue q2, int data) {
Queue p = null;
// 用队列q2来保存元素
if (!q1.isEmpty()) {
p = q1;
}else {
p = q2;
}
p.push(data);
}
public static int popStack(Queue q1, Queue q2) {
Queue p1 = null;
Queue p2 = null;
if (!q1.isEmpty()) {
// p1指向非空队列q2
p1 = q1;
// p2用来接收q2出队的元素
p2 = q2;
}else {
p1 = q2;
p2 = q1;
}
int num = 0;
if (!p1.isEmpty()) {
// 把p1中除了队尾的元素全部出队到p2
while(p1.usedSize > 1) {
num = p1.pop();
p2.push(num);
}
// p1的队尾元素就是栈顶元素
return p1.getTop();
}
return -1;
}
public static void main(String[] args){
Queue link1 = new Queue();
Queue link2 = new Queue();
enter(link1,link2,1);
enter(link1,link2,2);
enter(link1,link2,3);
link2.print();
System.out.println("出栈的元素是 :" + popStack(link1,link2));
link1.print();
}
}
结果是:
1 2 3
出栈的元素是 :3
1 2