《程序员面试宝典》☞ 集合栈

链接:https://www.nowcoder.com/questionTerminal/69f0ffed01c741c5ae5594a23f7cd739
题目:

请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。

给定一个操作序列int[][2] ope(C++为vector&ltvector&ltint>>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。请返回一个int[][](C++为vector&ltvector&ltint>>),为完成所有操作后的SetOfStacks,顺序应为从下到上,默认初始的SetOfStacks为空。保证数据合法。

思路:
        首先先初始化一个栈,大小size,按序进行push或pop操作
       1.执行push操作,即操作数为1时,先检查当前栈是否已满,已满先入队列,再新建一个栈再push,否则直接push到当前栈
        特别注意最后一个操作是push,若最后一个操作完成后,判断stack是否为空,不为空则入队列  
       2.执行pop操作,判断当前stack是否为空,不空直接pop,空的话队列pop出最后一个stack,再执行出栈操作,
       3.int[][],n*2数组,第一列表示何种操作,第二列表示操作数,循环执行            

import java.util.*;

public class SetOfStacks {
    
        //函数判断栈是否已满
        public boolean isFull(ArrayList<Integer> al,int size){
            if(al.size() == size){
                return true;
            }else{
                return false;
            }
        } 
        //进栈
        public void push(ArrayList<Integer> stack, int n){
            stack.add(n);            
        }
        //出栈
        public Integer pop(ArrayList<Integer> stack, int index){
            return stack.remove(index);            
        }
  
    public ArrayList<ArrayList<Integer>> setOfStacks(int[][] ope, int size) {
        /**
            首先先初始化一个栈,大小size,按序进行push或pop操作
            1.执行push操作,即操作数为1时,先检查当前栈是否已满,已满先入队列,再新建一个栈再push,否则直接push到当前栈
             特别注意最后一个操作是push,若最后一个操作完成后,判断stack是否为空,不为空则入队列  
                  2.执行pop操作,判断当前stack是否为空,不空直接pop,空的话队列pop出最后一个stack,再执行出栈操作,
            3.int[][],n*2数组,第一列表示何种操作,第二列表示操作数,循环执行            
        **/
         ArrayList<ArrayList<Integer>> retStackSet = new ArrayList <ArrayList<Integer>> (10000);        
         // 首先创建一个栈
         ArrayList<Integer> stack = new ArrayList<Integer>(size);
         for(int i=0; i< ope.length; i++){   //行数表示操作数
             if(ope[i][0] == 1){
                 if(this.isFull(stack, size)){
                     //旧栈入队列  -- >开辟新栈 -- >压栈
                     retStackSet.add(stack);
                     stack = new ArrayList<Integer>(size);                                                              
                 }                 
                     this.push(stack,ope[i][1]);                                                                                
             }else if(ope[i][0] == 2){    
                 //出栈
                 if(!stack.isEmpty()){
                    this.pop(stack,stack.size()-1);
                 }else{
                     //栈集合出队列--> stack更新 -- >出栈操作
                    stack = retStackSet.remove(retStackSet.size()-1);
                    this.pop(stack,stack.size()-1); 
                 }                              
             }               
             if(i == ope.length-1 && !stack.isEmpty()){
                 retStackSet.add(stack);
             }
         }                       
        return retStackSet;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值