(1)剑指 Offer 09. 用两个栈实现队列JAVA版

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof

通过两个栈来实现队列,栈是先进后出,而队列是先进先出,两个栈一个进一个出,一号栈进,二号栈出,二号栈没了要从一号栈里面要。

需注意的问题:

  1. 两个栈什么时候调个元素
  2. 分成几种情况(空与不空)
  3. 在那个哪个函数里面进行调个

解题过程如下

import java.util.Stack;

class CQueue {
	Stack<Integer> stack1= new Stack<>();
    Stack<Integer> stack2= new Stack<>();
    public CQueue() {
       
    }
    
    public void appendTail(int value) {
    	stack1.push(value);    	
    }
    
    public int deleteHead() {
    	if (stack2.empty() && stack1.empty()) {
    		return -1;
		}
    	else {
    		if(stack2.empty()) {
    			while (!stack1.empty()) {
        			
            		stack2.push(stack1.pop());
        		}
    		}
    		
    		return stack2.pop();
		}
    	
    	
    }
}

解决问题1:

两个栈什么时候调个?

必须在二号栈没有元素的时候,才能像一号栈要元素,假如二号栈还没有出完,那么一号栈的元素进来下次再出必出刚才进来的,违反了队列的顺序,这条是必须遵守的准则

二号栈是关键,决定了什么时候向一号栈要元素d

解决问题2:

分成几种情况(空与不空)

肯定是四种啦,为什么要考虑呢,因为这是我刷的第一道算法题,有点紧张没有吧 if 情况想全导致拉低了过率。if的情况不全在大量数据的测试下会垮掉

if (stack2.empty() && stack1.empty()) {
    		return -1;
		}
    	else {
    		if(stack2.empty()) {
    			while (!stack1.empty()) {
        			
            		stack2.push(stack1.pop());
        		}
    		}
    		
    		return stack2.pop();
		}

我是先考虑的什么时候返回-1,肯定是二号栈没有,但是一号栈要是有的话,队列还是非空的,所以需要二者同时为空,此队列空,返回负一,下一个条件就是判断什么时候向一号栈要元素,肯定是二号栈空且一号栈非空,那么还剩下两种情况没考虑,1空2不空直接出队列,1不空2也不空,也是直接出,所以直接写了return;

解决问题3:

在那个哪个函数里面进行调个?

二者都可以实现

总结:我感觉好像没啥用,时间复杂度还是O(1)哇,有队列用队列,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值