栈与队列面试题(Java数据结构)

前言:

        这里举两个典型的例子,实际上该类型的面试题是不确定的!

用栈实现队列:

        232. 用栈实现队列 - 力扣(LeetCode)

方法一:双栈
思路

将一个栈当作输入栈,用于压入 push 传入的数据;另一个栈当作输出栈,用于 pop 和 peek 操作。

每次 pop 或 peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。

class MyQueue {
    private Deque<Integer> st1;
    private Deque<Integer> st2;
    public MyQueue() {
        st1 = new ArrayDeque<>();
        st2 = new ArrayDeque<>();
    }
    
    public void push(int x) {
        st1.push(x);
    }
    
    public int pop() {
        if(st2.isEmpty()) {
            inout2();
        }
        return st2.pop();
    }

    public int peek() {
           if(st2.isEmpty()) {
            inout2();
        }
        return st2.peek();
    }
    
    public boolean empty() {
        if(st1.isEmpty() && st2.isEmpty()) {
            return true;
        }
        return false;
    }
    private void inout2() {
        while(!st1.isEmpty()) {
            st2.push(st1.pop());
        }
    }
}

用队列实现栈:

225. 用队列实现栈 - 力扣(LeetCode)

为了满足栈的特性,即最后入栈的元素最先出栈,在使用队列实现栈时,应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作,其中 queue 1用于存储栈内的元素,queue 2作为入栈操作的辅助队列入栈操作时,首先将元素入队到 queue 2,

然后将 queue 1​的全部元素依次出队并入队到 queue 2,此时 queue 2的前端的元素即为新入栈的元素,再将 queue1和queue 2互换,则 queue1的元素即为栈内的元素,queue1 的前端和后端分别对应栈顶和栈底由于每次入栈操作都确保 queue 1的前端元素为栈顶元素,

因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除 queue 1的前端元素并返回即可,获得栈顶元素操作只需要获得 queue 
1的前端元素并返回即可(不移除元素)。

class MyStack {
    private Queue<Integer> q1;
    private Queue<Integer> q2;
    public MyStack() {
        q1 = new LinkedList<>();
        q2 = new LinkedList<>();
    }
    
    public void push(int x) {
     q2.offer(x);
     while(!q1.isEmpty()){
        q2.offer(q1.poll());
     }
     Queue<Integer> tmp = q1;
     q1 = q2;
     q2 = tmp;
    }
    
    public int pop() {
     return q1.poll();
    }
    
    public int top() {
        return q1.peek();
    }
    
    public boolean empty() {
        if(q1.isEmpty() && q2.isEmpty()) {
            return true;
        }
        return false;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值