首页 > 试题广场 >

分条件出栈

[编程题]分条件出栈
  • 热度指数:18677 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定一个栈及一个操作序列int[][2] ope(C++中为vector<vector<int>>),代表所进行的入栈出栈操作。第一个元素为1则入栈,第二个元素为数的正负号;第一个元素为2则出栈,第二个元素若为0则出最先入栈的那个数,为1则出最先入栈的正数,为-1则出最先入栈的负数。请按顺序返回出栈的序列,并做异常处理忽略错误操作。

测试样例:
[[1,1],[1,-1],[2,0],[2,-1]]
返回:[1,-1]
推荐
思路:定义两个vector<int>对象A和B,分别用于存放收容所里的动物和被收养的动物
操作如下:
对ope数组从按行从i = 0 ~ ope.size() -1遍历
1、指令为1(ope[i][0] = 1)时,即有动物进来,则将动物序号压入A--执行A.push_back(ope[i][1]);
2、指令为2(ope[i][0] = 2)时,即有动物被收养,此时首先判断A是否为空,即是否有动物
    1)如果A为空,则continue
    2)如果A不为空
        1.如果操作为ope[i][1] = 0,即收养最先进来的动物,则将A[0]压入B,执行B.push_back(A[0]),然后在A中删除对应元素,即执行A.erase(A.begin());
        2.如果操作为ope[i][1] = 1,即收养最先进来的狗,此时遍历A找到第一个狗,然后将找到的元素压入B,再在A中删除对应元素;
        3.如果操作为ope[i][1] = -1,即收养最先进来的猫,此时遍历A找到第一个猫,然后将找到的元素压入B,再在A中删除对应的元素。
遍历完成之后,返回B。
代码如下所示:
class CatDogAsylum {
public:
    vector<int> asylum(vector<vector<int> > ope) {
        // write code here
        vector<int> A;   //定义动物序列
        vector<int> B;   //定义收养序列
        int i;     //定义循环变量
        int len = ope.size();
        for(i = 0; i < len; i ++)
            {
            if(ope[i][0] == 1) //有动物进来
                A.push_back(ope[i][1]);  //放入动物序列
            else
                if(A.empty())
                 continue;
                else
                 if(ope[i][1] == 0)  //第一种收养方式
                  {
                     B.push_back(A[0]);
                     A.erase(A.begin()); //从A中删除对应元素
                 }
              else
                     if(ope[i][1] == 1)  //收养狗
                     {
                         for(int j = 0; j < A.size(); j ++)
                       if(A[j] > 0)
                       {
                        B.push_back(A[j]);
                        A.erase(A.begin() + j); //从A中删除对应元素
                        break;
                    }
                     }
               else
                            for(int j = 0; j < A.size(); j ++)
                       if(A[j] < 0)
                       {
                        B.push_back(A[j]);
                        A.erase(A.begin() + j); //从A中删除对应元素
                        break;
                    }
        }
        return B;
    }
};
          
编辑于 2015-08-18 20:08:14 回复(4)
import java.util.*;

public class CatDogAsylum {
    public ArrayList<Integer> asylum(int[][] ope) {
        // write code here
        ArrayList<Integer> res =new ArrayList<Integer>();
        Deque<Integer> deque = new ArrayDeque<Integer>();
        for(int i = 0;i<ope.length;i++){
            if(ope[i][0]==1)deque.add(ope[i][1]);
            if(ope[i][0]==2){
                if(deque.isEmpty()) continue;
                if(ope[i][1]==0){
                    res.add(deque.poll());
                }
                if(ope[i][1]==1){
                    if(deque.peekFirst()>0) res.add(deque.poll());
                    else{
                        Stack<Integer> stack = new Stack<Integer>();
                        while(!deque.isEmpty() && deque.peekFirst()<0){
                            stack.push(deque.pollFirst());
                        }
                        if(!deque.isEmpty()) res.add(deque.pollFirst());
                        while(!stack.isEmpty()){
                            deque.addFirst(stack.pop());
                        }
                    }
                }
                if(ope[i][1]==-1){
                    if(deque.peekFirst()<0) res.add(deque.poll());
                    else{
                        Stack<Integer> stack = new Stack<Integer>();
                        while( !deque.isEmpty() && deque.peekFirst()>0){
                            stack.push(deque.pollFirst());
                        }
                        if(!deque.isEmpty()) res.add(deque.pollFirst());
                        while(!stack.isEmpty()){
                            deque.addFirst(stack.pop());
                        }
                    }
                }
            }
        }
        return res;
    }
}

发表于 2022-01-14 22:18:45 回复(0)
题目:给定一个栈及一个操作序列int[][2] ope(C++中为vector<vector<int>>),代表所进行的入栈出栈操作。第一个元素为1则入栈,第二个元素为数的正负号;第一个元素为2则出栈,第二个元素若为0则出最先入栈的那个数,为1则出最先入栈的正数,为-1则出最先入栈的负数。请按顺序返回出栈的序列,并做异常处理忽略错误操作。

理解: 这道题,有点难,首先就难在题目理解上,容易出现读半天,不知道它想表达什么意思, 用通俗点的话就是, 设一个两列不限行数的二维数组,这个二维数组,第一列放 数的处置规则(为 1 就入栈,为 2 就 出栈),第二列放 数 或者 数出栈的规则(为 0 就出第一个,为1 就出 第一个正数,为 -1 就出 第一个负数)
大概题意,应该读懂了,那就思考如何做,入栈容易,出栈难,要想 尽快出 第一个数,或者找第一个正数 或 负数,用栈肯定不方便,所以就想到了 用链表集合 LinkedList ,接下来的事情 就主要是 判断 每一行 第一列是 1 还是 2,然后 做出相应的 处理。   最后 用一个 数组集合 接收 出栈的  数字。

import java.util.*;

public class CatDogAsylum {
    public static ArrayList<Integer> asylum(int[][] ope) {
        // write code here
        LinkedList<int[]> list = new LinkedList<>();
        ArrayList<Integer> res = new ArrayList<>();
      //遍历 二维数组的每一行 
        for (int[] item : ope) { 
           //比较 每一行的第一个元素 是否为 1,为1 就放入集合
            if (item[0] == 1) {
                list.add(item);
                //比较 每一行的第一个元素 是否为21,为2 就出栈    
            } else if (item[0] == 2) {
              //如果第二个元素 为 0,就删除
                if (item[1] == 0) {
                    if (!list.isEmpty()) {
                        int[] animal = list.remove(0);
                        res.add(animal[1]);
                    }
                } else {
                    for (int i = 0; i < list.size(); i++) {
   //这个if 语句需要好好理解,它表示 输入数据的第二列 为 1 并且 入的 栈 的 第二个元素 大于 0,就移出当前元素
         // 如果 输入数据的 第二列 为 -1,并且 入的栈 的第二个元素 小于 0,也移出,所以 判断条件不能少 
                        if ((item[1] == 1 && list.get(i)[1] > 0) || (item[1] == -1 && list.get(i)[1] < 0)) {
                            int[] animal = list.remove(i);
                            res.add(animal[1]);
                            break;
                        }
                    }
                }

            }
        }
        return res;
    }

}




发表于 2021-10-24 14:55:30 回复(0)
import java.util.*;

public class CatDogAsylum {
    public ArrayList<Integer> asylum(int[][] ope) {
       ArrayList<Integer> animalHome = new ArrayList<Integer>();
        ArrayList<Integer> animalAdopted = new ArrayList<Integer>();
        for (int i = 0; i < ope.length; i++) {
            if (ope[i][0] == 1) {// 有动物进收养所
                animalHome.add(ope[i][1]);
                
            } else if (ope[i][0] == 2) {
                boolean flag = false;
                int animalType = 0;
                if (ope[i][1] == 1) {// 收养狗
                    // 从home中删除对应的记录
                    Iterator<Integer> iterator = animalHome.iterator();// 使用iterator避免ConcurrentModificationException
                    while (iterator.hasNext()) {
                        animalType = iterator.next();
                        if (animalType > 0){
                            flag = true;
                            iterator.remove(); // 注意这个地方
                            break;
                        }                    
                    }
                    if (flag) {
                        animalAdopted.add(animalType);
                    }
                } else if (ope[i][1] == -1) {// 收养猫
                    // 从home中删除对应的记录
                    Iterator<Integer> iterator = animalHome.iterator();// 使用iterator避免ConcurrentModificationException
                    while (iterator.hasNext()) {
                        animalType = iterator.next();
                        if (animalType < 0){
                            flag = true;
                            iterator.remove(); // 注意这个地方
                            break;
                        }                    
                    }
                    if (flag) {
                        animalAdopted.add(animalType);
                    }
                } else if (ope[i][1] == 0) {// 按照进home的顺序收养
                    if (animalHome != null && animalHome.size()>0) {
                        animalAdopted.add(animalHome.get(0));// 将收养所第一个进来的动物放入领养数组中
                        animalHome.remove(0);// 删除收养所的第一个进来的动物
                    }
                }
            }        
        }
        return animalAdopted;
    }
}

发表于 2018-12-24 17:09:38 回复(0)
求解惑...问题在哪
public ArrayList asylum(int[][] ope) {
        // write code here
        ArrayList list = new ArrayList();
        ArrayList resList = new ArrayList();
        for(int i=0;i<ope.length;i++){
            if(ope[i][0]==1)
                list.add(ope[i][1]);
            if(ope[i][0]==2){
                if(!list.isEmpty()){
                    if(ope[i][1]==0){        
                        resList.add(list.get(0));
                        list.remove(0);                        
                    }
                    if(ope[i][1]==1){            
                        int index = list.indexOf(1);
                        if(index!=-1){
                            resList.add(list.get(index));
                            list.remove(index);
                        }
                    }
                    if(ope[i][1]==-1){
                        int index = list.indexOf(-1);
                        if(index!=-1){
                            resList.add(list.get(index));
                            list.remove(index);
                        }
                    }
                }    
            }
        }
        return resList;
    }

发表于 2018-06-18 09:25:42 回复(1)
import java.util.*;

public class CatDogAsylum {
    public ArrayList<Integer> asylum(int[][] ope) {
        // write code here
        //定义LinkedList 用来保存猫狗,相当于收容所,ArrayList 用来保存领养的猫狗。
        LinkedList<Integer> ll = new LinkedList<Integer>();
        ArrayList<Integer> al = new ArrayList<Integer>();
        if(ope==null||ope.length==0||ope[0].length==0){
            return al;
        }
        //如果ope[i][0]==1,进入收养所
        for(int i=0 ; i<ope.length;i++){
            if(ope[i][0]==1){
                ll.add(ope[i][1]);
            }
            if(ope[i][0]==2){  //需要出所
                if(ope[i][1]==0){ //方式1
                    al.add(ll.remove(0));
                }else if(ope[i][1]==1){//收养狗
                    for(int j=0;j<ll.size();j++){
                        if(ll.get(j)>0){
                            al.add(ll.remove(j));
                            break;
                        }
                    }
                }else{  //收养猫
                    for(int j=0;j<ll.size();j++){
                        if(ll.get(j)<0){
                            al.add(ll.remove(j));
                            break;
                        }
                    }
                }
            }
        }
        return al;
         
    }
}

发表于 2017-12-22 10:45:51 回复(0)
import java.util.ArrayList;
import java.util.LinkedList;

public class CatDogAsylum {
    public ArrayList<Integer> asylum(int[][] ope) {
        LinkedList<int[]> list = new LinkedList<>();
        ArrayList<Integer> res = new ArrayList<>();
        for (int[] items : ope) {

            if (items[0] == 1) {
                // 如果遇到宠物就加入列表中(收容所)
                list.add(items);
            } else if (items[0] == 2) {
                // 如果遇到收养人
                // 采取第一种收养方式
                if (items[1] == 0) {
                    if (!list.isEmpty()) {
                        int[] animal = list.remove(0);
                        res.add(animal[1]);
                    }
                } else {
                    // 收取猫或狗(若为1,则指定收养狗,若为-1则指定收养猫)
                    for (int i = 0; i < list.size(); i++) {
                        // 收容所有合适宠物则弹出
                        if ((items[1] == 1 && list.get(i)[1] > 0) || (items[1] == -1 && list.get(i)[1] < 0)) {
                            // 移除宠物
                            int[] animal = list.remove(i);
                            res.add(animal[1]);
                            // 结束本层循环
                            break;
                        }
                    }
                }
            }
        }
        return res;
    }
}
发表于 2017-10-01 00:56:07 回复(1)
维护两个队列。一个首部队列,一个尾部队列。
因为动物类型只有两种所以保证以下性质:
1、首部队列尾部队列按序排列。
2、首部队列仅保存相同类型的动物。

收容:所有动物加入尾部队列队尾。

收养:先检查首部队列,符合要求则出队。如果首部队列队列不符合要求(队列为空或动物类型不符)则检查尾部队列:在非空前提下,将所有不符合类型的动物入队首部队列,直到找到合适类型的动物出队。
import java.util.*;

public class CatDogAsylum {
    public ArrayList<Integer> asylum(int[][] ope) {
        // write code here
        ArrayList<Integer> res = new ArrayList<Integer>();
        Queue<Integer> animal = new LinkedList<Integer>();//尾部队列
        Queue<Integer> head = new LinkedList<Integer>();//首部队列
        for(int i = 0; i < ope.length; i++){
            if(ope[i][0] == 1){
                animal.offer(ope[i][1]);
            }
            if(ope[i][0] == 2){
                if(ope[i][1] == 0){
                    if(!head.isEmpty()){
                        res.add(head.poll());
                    }else if(!animal.isEmpty()){
                        res.add(animal.poll());
                    }
                }else{
                    if(!head.isEmpty()&&head.peek()*ope[i][1] > 0){
                        res.add(head.poll());
                        continue;
                    }
                    while(!animal.isEmpty()&&animal.peek()*ope[i][1] < 0){
                        head.offer(animal.poll());
                    }
                    if(!animal.isEmpty()){
                        res.add(animal.poll());
                    }
                }
            }
        }
        return res;
    }
}
发表于 2017-09-12 17:49:12 回复(0)
 public ArrayList<Integer> asylum(int[][] ope) {
        
        ArrayList<Integer> list = new ArrayList<>();
        Queue<int[]> queueDog = new LinkedList<>();
        Queue<int[]> queueCat = new LinkedList<>();
        int[] anim2time;
        Queue<int[]> queue;
        int time = 0;//标记时间
        for (int o[] : ope) {
            if (o[0] == 1) {
                time++;
                queue = o[1] > 0 ? queueDog : queueCat;
                anim2time = new int[2];
                anim2time[0] = o[1];
                anim2time[1] = time;
                queue.offer(anim2time);
            } else {
                switch (o[1]) {
                    case 0:
                        if (queueCat.isEmpty() && queueDog.isEmpty()) {
                            continue;
                        }
                        if (queueCat.isEmpty() || queueDog.isEmpty()) {
                            queue = queueCat.isEmpty() ? queueDog : queueCat;
                            list.add(queue.poll()[0]);
                            continue;
                        }
                        int catTime = queueCat.peek()[1];
                        int dogTime = queueDog.peek()[1];
                        queue = catTime < dogTime ? queueCat : queueDog;
                        list.add(queue.poll()[0]);
                        break;
                    case 1:
                        if (!queueDog.isEmpty()) {
                            list.add(queueDog.poll()[0]);
                        }
                        break;
                    case -1:
                        if (!queueCat.isEmpty()) {
                            list.add(queueCat.poll()[0]);
                        }
                        break;
                }
            }
        }
        return list;
    }
编辑于 2017-04-20 11:19:45 回复(0)
思路:只需要用一个额外的list就可以实现操作。
1  当为有动物进入收容所模式的时候,就直接用list存储对应的猫或狗.
   (list集合add属性是先存储的数放在index索引最小处)。
2  当为有人收养动物的时候:
    1) 直接收养最早的:即收养list中index索引最小的数;
    2)领养最早进入收容所的狗:从list中最小的index索引遍历大于0的数(表示狗)并添加即可;
    3)领养最早进入收容所的猫:从list中最小的index索引遍历小于0的数(表示猫)并添加即可;
code如下;

import java.util.*;

public class CatDogAsylum {
    public static ArrayList<Integer> asylum(int[][] ope) {
	       
		  ArrayList<Integer> list = new ArrayList<Integer>();
		  ArrayList<Integer> tempList = new ArrayList<Integer>();		  
		  int len = ope.length;//操作次数
                    
		  for(int i = 0; i < len; i++){			  
			  if(ope[i][0] == 1){
				  //第二个数为0则为不合法操作,如(1,1)代表收养狗,(1,-4)代表收养猫;(1,0)无操作
				  if(ope[i][1] != 0){
					  tempList.add(ope[i][1]);
				  }
			  }
			  if(ope[i][0] == 2){
				  int tempListSize = tempList.size();
				  int index = 0;
				  //获取最早的收养动物
				  if(ope[i][1] == 0){
					  list.add(tempList.get(0));
					  tempList.remove(0);
				  }else if(ope[i][1] == 1){//获取收养最早的狗
					  while(index < tempListSize){
						  //tempList中放入最早的数即为index最小的数
						  int dog = tempList.get(index);
						  if(dog > 0){
							  list.add(dog);
							  tempList.remove(index);
							  break;
						  }
						  index++;
					  }
				  }else{//获取最早的猫
					  while(index < tempListSize){
						  int cat = tempList.get(index);
						  if(cat < 0){
							  list.add(cat);
							  tempList.remove(index);
							  break;
						  }
						  index++;
					  }
				  }
			  }
			  
			  
		  }
		  
		  return list;
	        
	    }
	  
}

编辑于 2017-03-17 10:55:23 回复(0)