堆栈队列相互实现
队列:先进先出;栈:先进后出
1、两个堆栈实现队列(有两个堆栈stack1,stack2)
入列:添加到stack1中 删除队列头部元素;
出列:如果两个堆栈都是空的,那么抛出异常,如果stack2非空,将栈顶pop,如果stack2是空的,判断stack1大小是否是1,如果是1,那么直接pop返回栈顶元素即可,如果不是就把stack1元素pop到stack2中,然后pop返回stack2栈顶元素即可 。
2、两个队列实现堆栈(有两个队列queue1,queue2)
入栈:添加到非空的队列中,如果两个都是空的,添加到queue1中 删除栈顶元素;
出栈:如果两个队列都是空的,那么抛出异常,如果有,判断非空的队列长度是否是1,如果是1,直接poll即可,如果不是1,那么需要使用poll删除队列头部,然后添加到另一个队列中,直到只剩下1个元素,该元素即为栈顶元素,poll删除返回即可。
代码:
1、两个堆栈实现队列:
public class StackQueue {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
Queue<Integer> queue1 = new ArrayDeque<Integer>();
Queue<Integer> queue2 = new ArrayDeque<Integer>();
public void queuePush(int node) {
stack1.push(node);
}
public int queuePop() {
if (stack1.empty() && stack2.empty())
throw new RuntimeException("stack null!!");
if (!stack2.empty()) {
return stack2.pop();
}
if (stack1.size() == 1)
return stack1.pop();
while (!stack1.empty()) {
stack2.push(stack1.pop());
}
return stack2.pop();
}
public void stackPush(int node) {
if (queue1.isEmpty() && queue2.isEmpty()) {
queue1.offer(node);
} else if (!queue1.isEmpty()) {
queue1.offer(node);
} else {
queue2.offer(node);
}
}
public int stackPop() {
if (queue1.isEmpty() && queue2.isEmpty()) {
throw new RuntimeException("queue null!!");
}
if (!queue1.isEmpty()) {
if (queue1.size() == 1)
return queue1.poll();
while (queue1.size() > 1) {
queue2.offer(queue1.poll());
}
return queue1.poll();
}
if (queue2.size() == 1)
return queue2.poll();
while (queue2.size() > 1) {
queue1.offer(queue2.poll());
}
return queue2.poll();
}
public static void main(String[] args) {
StackQueue sq = new StackQueue();
System.out.println("向队列中添加1,2,3,4");
sq.queuePush(1);
sq.queuePush(2);
sq.queuePush(3);
sq.queuePush(4);
System.out.println("依次删除队列头部");
for (int i = 0; i < 4; i++)
System.out.println(sq.queuePop());
System.out.println("向堆栈中添加1,2,3,4");
sq.stackPush(1);
sq.stackPush(2);
sq.stackPush(3);
sq.stackPush(4);
System.out.println("依次删除栈顶元素");
for (int i = 0; i < 4; i++)
System.out.println(sq.stackPop());
sq.queuePush(190);
sq.queuePush(100);
System.out.println(sq.queuePop());
sq.queuePush(200);
System.out.println(sq.queuePop());
System.out.println(sq.queuePop());
sq.stackPush(18);
sq.stackPush(19);
System.out.println(sq.stackPop());
sq.stackPush(20);
System.out.println(sq.stackPop());
System.out.println(sq.stackPop());
}
}

浙公网安备 33010602011771号