用两个栈实现队列和用两个队列实现栈的实现
用两个栈实现队列
基本思路:
入队列:sk1模拟入队列,所有入队列的元素都放入到s1中
出队列:sk2模拟出队列,当s2为空时,将s1中所有元素导入到sk2,sk2中pop一个元素就是出队元素,如果说s2不为空,直接pop一个元素就是出队元素。 获取队头元素:如果sk2是空,将s1中所有元素导入sk2中,然后peek()一个元素。
java实现:
import java.util.Stack; public class CQueue { public Stack<Integer> sk1; public Stack<Integer> sk2; public CQueue() { sk1 = new Stack<>(); sk2 = new Stack<>(); } public void appendTail(int value) { sk1.push(value);//sk1模拟入队列,所有入队列的元素都放入到s1中 } //sk2模拟出队列,当s2为空时,将s1中所有元素导入到sk2,sk2中pop一个元素就是出队元素,如果说s2不为空,直接pop一个元素就是出队元素。 public int deleteHead() { if (sk1.isEmpty() && sk2.isEmpty()) { return -1; } if (sk2.isEmpty()) { while (!sk1.isEmpty()) { sk2.push(sk1.pop()); } } return sk2.pop(); } public static void main(String[] args) { CQueue cQueue = new CQueue(); cQueue.appendTail(1); cQueue.appendTail(2); cQueue.appendTail(4); cQueue.appendTail(5); System.out.println(cQueue.deleteHead()); } }
两个队列实现栈
基本思路:
借助两个队列来模拟实现栈。一个队列是辅助的,起到导元素的作用
入栈:
先将元素放入a队列中,如果b不空,将b中所有元素导入到a中, 此时,刚刚入栈的元素刚好在a的队头,然后将a和b队列交换下
即:b队列队头相当于栈顶,b队列队尾相当于栈底
出栈:
直接从b中poll()即可
获取栈顶元素:
直接从b中peek()即可java实现:
class MyStack { private Queue<Integer> a; // a是用来辅助导元素的 private Queue<Integer> b; // 元素全部放在b中 public MyStack() { a = new LinkedList<>(); b = new LinkedList<>(); } public void push(int x) { // 先把元素放入a队列中 a.offer(x); while(!b.isEmpty()){ a.offer(b.poll()); } Queue<Integer> temp = a; a = b; b = temp; } public int pop() { return b.poll(); } public int top() { return b.peek(); } public boolean empty() { return b.isEmpty(); } }