栈与队列练习题

Posted TGB-Earnest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈与队列练习题相关的知识,希望对你有一定的参考价值。

前言

我们之前说了队列和栈的特点以及其他知识,今天我们来做一下相关的练习

练习题

队列

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

解析

这个题的重点是如何将先进先出改变成先进后出,只要把这个解决了,也就出来了。
我们可以用两个队列,进行来回的交替。

  //先放在辅助队列中
        queue2.offer(x);
        while (!queue1.isEmpty())
            queue2.offer(queue1.poll());
        
        Queue<Integer> queueTemp;
        queueTemp = queue1;
        queue1=queue2;
        queue2=queueTemp;// 最后交换queue1和queue2,将元素都放到queue1中

从这段代码中,我们可以看出来,辅助队列queue2,用来存储最新的值,然后将queue1中的值进行弹出道queue2中,queue1弹出完之后为空,然后赋值给临时队列,将queue2给1,最后将2也为空。
整体代码为:

public class MyStack 
    Queue<Integer> queue1; //和栈中保持一样
    Queue<Integer> queue2; //辅助队列

    public  MyStack()
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    
    public void push(int x)
        //先放在辅助队列中
        queue2.offer(x);
        while (!queue1.isEmpty())
            queue2.offer(queue1.poll());
        
        Queue<Integer> queueTemp;
        queueTemp = queue1;
        queue1=queue2;
        queue2=queueTemp;// 最后交换queue1和queue2,将元素都放到queue1中
    
    public int pop()
        // 因为queue1中的元素和栈中的保持一致,所以这个和下面两个的操作只看queue1即可
        return queue1.poll();
    

    public int top()
        return queue1.peek();
    

    public boolean empty()
        return queue1.isEmpty();
    

    public static void main(String[] args) 
        MyStack myQueue = new MyStack();
        for (int i = 0; i < 10; i++) 
            myQueue.push(i);
        
        myQueue.pop();
    

链接:https://leetcode.cn/problems/implement-stack-using-queues

用两个栈实现一个队列,来说是比较容易的,因为只需把第一个栈的元素弹出到另一个栈中,这样再弹出的顺序从整体来看又变成了先进先出了。

public class MyQueue 
    private Stack<Integer> input;
    private Stack<Integer> output;

    public MyQueue() 
        input = new Stack<>();
        output = new Stack<>();
    
    public void push(int x)
        input.push(x);
    
    public int pop()
        //如果b栈为空,则将input栈全部弹出并压入b栈中,然后b.pop()
        if (output.isEmpty())
            while (!input.isEmpty())
                output.push(input.pop());
            
        
        return output.pop();
    
    public int peek()
        if (output.isEmpty())
            while (!input.isEmpty())
                output.push(input.pop());
            
        
        return output.peek();
    
    public boolean empty()
        return input.isEmpty() && output.isEmpty();
    

    public static void main(String[] args) 
        MyQueue myQueue = new MyQueue();
        myQueue.push(1);
        myQueue.push(2);
        myQueue.push(3);
        myQueue.pop();


    


我们会持续更新这方面题

以上是关于栈与队列练习题的主要内容,如果未能解决你的问题,请参考以下文章

单调栈与队列的概念与练习!建议收藏

数据结构习题--栈与队列

算法习题---栈与队列之栈的数学性质

数据结构之栈与队列

栈与队列

python - 栈与队列(只有代码)