Day08&&Day09|复习&&栈与队列01

栈与队列基础知识:

Java数据结构中的栈和队列(带

图解)-CSDN博客


232.用栈实现队列

初始思路&&题解复盘

        这里首先是考虑到肯定需要另一条栈用来改变存入数据的栈的输入和输出的顺序,但是忽略了一些小细节。

        1)必须首先判断栈2是否为空,再将栈1元素存入栈2,不然输入输出的顺序就会被改变。

        2)虽然pop和peak思路相近,可以复用pop的代码,但是因为是peak我只需要知道队头的数据是什么,但是不需要让他出来,所以调用pop后还需要将元素push回去。

        3)判断为空时需要判断栈1和栈2是否均为空,只有均为空才可以return true;

class MyQueue {

        Stack<Integer> stack;//栈
        Stack<Integer> stack1;//反着的栈。

    public MyQueue() {

        stack = new Stack<>();//用来存放栈的顺序    
        stack1 = new Stack<>();

    }
    
    public void push(int x) {
        stack.push(x);
    }
    
    public int pop() {
        //在栈中出去的应该是最后一个进入的元素
        //在队列中理应返回的是第一个进入的元素,应该如何实现。
        if(stack1.empty()){
        while(!stack.empty()){
            int n = stack.pop();
            stack1.push(n);
        }}
        
        return stack1.pop();


    }
    
    public int peek() {

        int result = this.pop();
        stack1.push(result);
        return result;

    }
    
    public boolean empty() {
        if(stack.empty()&&stack1.empty()){return true;}
        else{return false;}
    }
}

225. 用队列实现栈 

 初始思路:

        首先了解到Queue 是个接口,在实例化时必须实例化 LinkedList 的对象,因为 LinkedList 实现了 Queue 接口。而linkedlist是有index的那我不是想删谁删谁,想输出谁输出谁!

class MyStack {
        Queue<Integer> q;

    public MyStack() {

        q=new LinkedList<>();
    }
    
    public void push(int x) {

        q.offer(x);

    }
    
    public int pop() {
        int result =((LinkedList<Integer>) q).get(q.size()-1);
            
        q.remove(((LinkedList<Integer>) q).get(q.size()-1));
        return result;

    }
    
    public int top() {
            int result =((LinkedList<Integer>) q).get(q.size()-1);
            return result;
    }
    
    public boolean empty() {

        return q.isEmpty();

    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

但是没有AC,开始寻找问题出现在哪里,存入的顺序是1,2,3,4,2,但是按照我的逻辑pop就会2,2,4,3,1。很显然转为Linkedlist不能解决我的问题。

题解复盘:

        栈pop的应该是最后存入的,但是在队列中最后存入的会最后出,所以在pop中先弹出最后一个前面的那些,然后在存入,这样我再弹出的就是我想要的。

class MyStack {
        Queue<Integer> q;

    public MyStack() {

        q=new LinkedList<>();
    }
    
    public void push(int x) {

        q.offer(x);

    }
    
    public int pop() {
        int n = q.size()-1;
        while(n>0){
            q.offer(q.poll());
            n--;
        }
        return q.poll();
    }
    
    public int top() {
            
         int result = this.pop();
         q.offer(result);
         return result;
    }
    
    public boolean empty() {

        return q.isEmpty();

    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值