用两个栈实现队列和用两个队列实现栈的实现

用两个栈实现队列和用两个队列实现栈的实现

用两个栈实现队列

基本思路:
入队列: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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WindFall1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值