您当前的位置: 首页 >  算法

Phil Arist

暂无认证

  • 2浏览

    0关注

    276博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

算法修炼4、用两个栈实现队列

Phil Arist 发布时间:2021-10-15 11:05:24 ,浏览量:2

题目描述:

  用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

  解题思路:

  本题的基本意图是:用两个后入先出的栈来实现先入先出的队列。对于这个问题,我们可以通过一个实例来进行具体分析。不难得出相应的规律:有两个栈stack1和stack2,每次向队列中插入元素可以都压入到stack1中,当需要从队列中删除元素时,我们应该是删除最早插入的那个(FIFO),这时可以将stack1中的元素逐个弹出并压入stack2,直到stack1为空,这时最早插入的元素就位于stack2的栈顶,可以直接弹出。

  因此,我们总结如下:压入元素时,都压入栈1,当需要弹出时,从栈2弹出,当栈2不为空时直接弹出栈顶元素,为空时将栈1的元素“倒进去”。

  举例:

  编程实现(Java):

public class Solution {
    Stack stack1 = new Stack();
    Stack stack2 = new Stack();
   
    public void push(int node) {
        stack1.push(node);
    }
    
    public int pop() {
        if(stack2.empty()){  //为空时将栈1的元素“倒进去”
            while(!stack1.empty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}

  扩展:用两个队列实现一个栈

  用两个队列实现栈相比稍微复杂,当插入一个元素时,可以选择不为空的那个队列直接加进去,而当删除一个元素时,需要借助另一个空队列,首先依次删除原队列的头,并将删除的元素加入另一个队列,直到找到队列最后一个元素,将其删除,这时原来的数据队列变空,另一个队列变为数据栈。

class MyStack {
    Queue q1,q2;
    int topValue;

    /** Initialize your data structure here. */
    public MyStack() {
        q1=new LinkedList();
        q2=new LinkedList();
        topValue=0;
    }
    
    /** Push element x onto stack. */
    public void push(int x) {  //压入到不为空的那个队列中
        if(!q1.isEmpty())  
            q1.add(x);
        else
            q2.add(x);
        
        topValue=x;
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        
        int temp=0;
        while(!q1.isEmpty()){  //q1不空
            temp=q1.poll();
            if(q1.isEmpty())
                return temp;
            q2.add(temp);
            topValue=temp;
        }
        while(!q2.isEmpty()){  //q1不空
            temp=q2.poll();
            if(!q2.isEmpty()){
                q1.add(temp);
                topValue=temp;
            }
        }
        return temp;
    }
    
    /** Get the top element. */
    public int top() {
        return topValue;
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        return q1.isEmpty() && q2.isEmpty();
    }
}
关注
打赏
1662360869
查看更多评论
立即登录/注册

微信扫码登录

0.9773s