zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【算法】【栈和队列模块】使用栈数据结构实现一个队列的基本功能

算法模块队列队列数据结构 实现 一个 基本功能
2023-09-11 14:14:53 时间

前言

当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

问题介绍

原问题
使用栈数据结构实现一个队列的基本功能:pop,poll,isEmpty

解决方案

解决思路,具体逻辑为:
1、纳管两个Stack栈结构,inStack,outStack,一个负责入队列、一个负责出队列
步骤:
1、入队列:inStack直接push即可
3、出队列:outStack需要inStack中的全部数值,outStack再弹出一个即可
时间:O(1) 空间 O(n)

代码编写

java语言版本

方案一实现:


public class TowStacksQueue {
    private Stack<Integer> inStack;
    private Stack<Integer> outStack;

    public TowStacksQueue() {
        this.inStack = new Stack<>();
        this.outStack = new Stack<>();
    }

    /**
     * 队列进
     * @param num
     */
    public void add(Integer num){
        inStack.push(num);
    }

    /**
     * 队列出一个
     * @return
     */
    public Integer poll(){
        if(inStack.isEmpty() && outStack.isEmpty()){
            throw new RuntimeException("双栈空,没有数据了~");
        }
        if(outStack.isEmpty()){
            while (!inStack.isEmpty()){
                outStack.push(inStack.pop());
            }
        }
        return outStack.pop();
    }

    /**
     * 队列尾巴元素
     * @return
     */
    public Integer peek(){
        if(inStack.isEmpty() && outStack.isEmpty()){
            throw new RuntimeException("双栈空,没有数据了~");
        }
        if(outStack.isEmpty()){
            while (!inStack.isEmpty()){
                outStack.push(inStack.pop());
            }
        }
        return outStack.peek();
    }

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


    @Override
    public String toString() {
        return "TowStacksQueue{" +
                "inStack=" + inStack +
                ", outStack=" + outStack +
                '}';
    }

    //private static final Logger log = Logger.getLogger("TowStacksQueue");


    public static void main(String[] args) {
        TowStacksQueue towStacksQueue = new TowStacksQueue();
        int[] arr = {2, 1, 4, 5, 3};
        // 随机吐出来一个,验证半途中poll
        int index = (int)(Math.random() * arr.length);
        for (int i = 0; i < arr.length; i++){
            System.out.printf("当前进入字符%d\n", arr[i]);
            towStacksQueue.add(arr[i]);
            System.out.printf("当前队列:%s\n", towStacksQueue.toString());
            if (i == index){
                System.out.printf("随机吐出:%d\n", towStacksQueue.poll());
            }
        }
        // 吐
        while (!towStacksQueue.isEmpty()){
            Integer poll = towStacksQueue.poll();
            System.out.printf("吐出当前队列头:%s\n", poll);
            System.out.printf("当前队列:%s\n", towStacksQueue.toString());
        }
    }


}

c语言版本

正在学习中

c++语言版本

正在学习中

思考感悟

此题较简单,从中可以看出来算法主要体现的就是栈和队列之间的最大区别,栈先进后出,队列先进先出,所以必然有一个过程就是栈需要全部弹出来才能实现队列的逻辑。

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可咨询2260755767@qq.com或在评论区回复即可.