链接:https://www.nowcoder.com/questionTerminal/69f0ffed01c741c5ae5594a23f7cd739
题目:
请实现一种数据结构SetOfStacks,由多个栈组成,其中每个栈的大小为size,当前一个栈填满时,新建一个栈。该数据结构应支持与普通栈相同的push和pop操作。
给定一个操作序列int[][2] ope(C++为vector<vector<int>>),每个操作的第一个数代表操作类型,若为1,则为push操作,后一个数为应push的数字;若为2,则为pop操作,后一个数无意义。请返回一个int[][](C++为vector<vector<int>>),为完成所有操作后的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;
}
}