实现队列和栈的转换

栈和队列有什么区别呢?

栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素的操作。栈中的数据元素遵守后进先出的原则。如图,栈顶的元素先出栈,最后出栈的元素是最先进入栈的元素。

                              

队列也是一种特殊的线性表,但是,只允许在一端插入数据,另一端删除数据。队列的数据元素遵守先进先出的原则。进行插入操作的一端称为队尾,进行删除操作的一端称为对头。

                            

例题1:用两个队列实现一个后入先出的栈

两个队列,queue1用于存储栈内的元素,queue2作为入栈操作的辅助队列。入栈时,首先将元素入栈到queue2,然后将queue1的全部元素依次出队,并入队道queue2,此时queue2的前端元素即为新入栈的元素。然后,将queue1和queue2互换,这样,queue1的元素就为栈内的元素,queue1的前端和后端分别对应栈顶和栈底。

class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;

    //初始化两个队列的数据结构
    public MyStack() {
        queue1 = new LinkedList<Integer>();
        queue2 = new LinkedList<Integer>();
    }
    
   //将元素x入栈到栈中
    public void push(int x) {
        queue2.offer(x);//将元素入栈到queue2
        while (!queue1.isEmpty()) {
            queue2.offer(queue1.poll());//将queue1中的元素出队,入栈到queue2中
        }
        Queue<Integer> temp = queue1;//将queue2中的全部元素入栈到queue1
        queue1 = queue2;
        queue2 = temp;
    }
    
    //将栈顶的元素删除,并返回该值
    public int pop() {
        return queue1.poll();
    }
    
   //获得栈顶的元素
    public int top() {
        return queue1.peek();
    }
    
   //栈中是否为空
    public boolean empty() {
        return queue1.isEmpty();
    }
}

例题2:用两个栈实现先入先出的队列

两个栈,一个作为输入栈,另一个作为输出栈。每次出栈或查看栈顶元素时,若输出栈为空,就将输入栈的全部元素弹出,并入栈到输出栈。这样,输出栈从栈顶往栈底的顺序,即为队列从队首往队尾的顺序。

class MyQueue {
    Deque<Integer> inStack;
    Deque<Integer> outStack;

    public MyQueue() {//初始化两个栈
        inStack = new ArrayDeque<Integer>();
        outStack = new ArrayDeque<Integer>();
    }

    public void push(int x) {
        inStack.push(x);
    }

    public int pop() {
        if (outStack.isEmpty()) {//如果输出栈为空,则将输入栈的全部元素弹出,入栈到输出栈
            in2out();
        }
        return outStack.pop();
    }

    public int peek() {//查看拿到栈顶元素 
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.peek();
    }

    public boolean empty() {
        return inStack.isEmpty() && outStack.isEmpty();
    }

    private void in2out() {
        while (!inStack.isEmpty()) {//如果输入栈不为空,则将全部元素入栈到输出栈
            outStack.push(inStack.pop());
        }
    }
}

猜你喜欢

转载自blog.csdn.net/m0_72000264/article/details/130154896