八、数组模拟栈(扩容)/求栈中的最小值/栈实现队列/队列实现栈

数组模拟栈

public static class ArrayStack {
	private Integer[] arr;
	private Integer size;

	public ArrayStack(int initSize) {
		if (initSize < 0) {
			throw new IllegalArgumentException("The init size is less than 0");
		}
		arr = new Integer[initSize];
		size = 0;
	}

	public Integer peek() {
		if (size == 0) {
			return null;
		}
		return arr[size - 1];
	}

	public void push(int num) {
		if (size == arr.length) {
			throw new ArrayIndexOutOfBoundsException("The queue is full");
		}
		arr[size++] = num;
	}

	public Integer pop() {
		if (size == 0) {
			throw new ArrayIndexOutOfBoundsException("The queue is empty");
		}
		return arr[--size];
	}
}

数组模拟栈(自动扩容)

public class MyStack {
    public static void main(String[] args) {
        MyStack stack = new MyStack(3);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        System.out.println(stack.size());
    }
    private int[] storage;  //存放栈中元素的数组
    private int capacity;   //栈的容量
    private int count;      //栈中元素数量
    private static final int GROW_FACTOR = 2; //扩容因子

    //TODO:不带初始容量的构造方法,默认容量为8
    public MyStack() {
        this.capacity = 8;
        this.storage=new int[8];
        this.count = 0;
    }

    //TODO:带初始容量的构造方法
    public MyStack(int initialCapacity) {
        if (initialCapacity < 1)
            throw new IllegalArgumentException("Capacity too small.");
        this.capacity = initialCapacity;
        this.storage = new int[initialCapacity];
        this.count = 0;
    }

    //TODO:入栈
    public void push(int value) {
        if (count == capacity) {
            ensureCapacity();
        }
        storage[count++] = value;
    }

    //TODO:扩容
    private void ensureCapacity() {
        // 扩容的容量
        int newCapacity = capacity * GROW_FACTOR;
        // 扩容后的数组,大小是原来的两倍,保留原数组中元素
        storage = Arrays.copyOf(storage, newCapacity);
        // 更新容量
        capacity = newCapacity;
    }

    //TODO:返回栈顶元素并出栈
    private int pop() {
        count--;
        if (count == -1)
            throw new IllegalArgumentException("Stack is empty.");

        return storage[count];
    }

    //TODO:返回栈顶元素不出栈
    private int peek() {
        if (count == 0){
            throw new IllegalArgumentException("Stack is empty.");
        }else {
            return storage[count-1];
        }
    }

    //TODO:判断栈是否为空
    private boolean isEmpty() {
        return count == 0;
    }

    //TODO:返回栈中元素的个数
    private int size() {
        return count;
    }
}

返回栈中的最小元素

public static class MyStack1 {
	private Stack<Integer> stackData;
	private Stack<Integer> stackMin;

	public MyStack1() {
           //放真实数据的栈
           this.stackData = new Stack<>();
           // 存放最小值的栈
           this.stackMin = new Stack<>();
	}

       public void push(int newNum) {
           // 如果min栈为空,则放入当前数
           if (this.stackMin.isEmpty()) {
               this.stackMin.push(newNum);
           } else if (newNum < this.getMin()) {
               // 如果当前数比min栈栈顶元素小,压入当前数
               this.stackMin.push(newNum);
           } else {
               // 否则min的栈顶更小,重复压入栈顶元素
               int newMin = this.stackMin.peek();
               this.stackMin.push(newMin);
           }
           // 压入data栈
           this.stackData.push(newNum);
       }

       public int pop() {
           if (this.stackData.isEmpty()) {
               throw new RuntimeException("Your stack is empty.");
           }
           this.stackMin.pop();
           return this.stackData.pop();
       }
       /**
        * 返回min栈的栈顶元素
        * @return
        */
       public int getMin() {
           if (this.stackMin.isEmpty()) {
               throw new RuntimeException("Your stack is empty.");
           }
           return this.stackMin.peek();
       }
}

栈实现一个队列

/**
 * 两个栈实现一个队列
 */
public static class TwoStacksQueue {
    private Stack<Integer> stackPush;
    private Stack<Integer> stackPop;

    public TwoStacksQueue() {
        stackPush = new Stack<>();
        stackPop = new Stack<>();
    }

    /**
     * 入队列
     * @param pushInt
     */
    public void push(int pushInt) {
        stackPush.push(pushInt);
    }

    /**
     * 出队列
     * @return
     */
    public int poll() {
        if (stackPop.empty() && stackPush.empty()) {
            throw new RuntimeException("Queue is empty!");
        } else if (stackPop.empty()) {
            // 如果pop栈为空,将push栈元素全部倒入pop栈,直到push栈为空
            while (!stackPush.empty()) {
                stackPop.push(stackPush.pop());
            }
        }
        // 从pop栈弹出一个就是最先进入push栈的元素
        return stackPop.pop();
    }

    /**
     * 返回队列头
     * @return
     */
    public int peek() {
        if (stackPop.empty() && stackPush.empty()) {
            throw new RuntimeException("Queue is empty!");
        } else if (stackPop.empty()) {
            while (!stackPush.empty()) {
                stackPop.push(stackPush.pop());
            }
        }
        return stackPop.peek();
    }
}
队列实现栈
/**
 * 两个队列实现栈
 */
public static class TwoQueuesStack {
    private Queue<Integer> dataQueue;
    private Queue<Integer> helpQueue;

    public TwoQueuesStack() {
        dataQueue = new LinkedList<>();
        helpQueue = new LinkedList<>();
    }

    /**
     * 入栈,都加入到data队列里
     * @param pushInt
     */
    public void push(int pushInt) {
        dataQueue.add(pushInt);
    }

    /**
     * 返回栈顶元素,数据总数不变
     * @return
     */
    public int peek() {
        if (dataQueue.isEmpty()) {
            throw new RuntimeException("Stack is empty!");
        }
        while (dataQueue.size() != 1) {
            //data队列中除了最后一个加入的元素外,其他元素都加入到help队列
            helpQueue.add(dataQueue.poll());
        }
        // 取出最后一个加入data队列的元素
        int res = dataQueue.poll();
        // 将该元素也加入到help队列
        helpQueue.add(res);
        // 交换引用
        swap();
        return res;
    }

    /**
     * 出栈
     * @return
     */
    public int pop() {
        if (dataQueue.isEmpty()) {
            throw new RuntimeException("Stack is empty!");
        }
        // 当data队列的元素大于1时,将data队列中的元素放入到help队列
        while (dataQueue.size() > 1) {
            helpQueue.add(dataQueue.poll());
        }
        // data队列中只剩一个元素时,上面操作停止,取出最后一个元素,就是最后加入的元素
        int res = dataQueue.poll();
        // 此时data队列为空,help队列存放最先加入的数据到倒数第二次加入的数据,交换引用
        swap();
        return res;
    }

    private void swap() {
        Queue<Integer> tmp = helpQueue;
        helpQueue = dataQueue;
        dataQueue = tmp;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面可以对界面显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值