Как непрерывно подавать элементы из массива в два стека, эти два стека будут затем подавать данные в очередь - PullRequest
0 голосов
/ 04 октября 2019

текстовый файл, который содержит набор элементов, таких как: t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18

Два стека и очередь ограничены вместимостью только по 7 предметов в каждом, мне нужно непрерывно подавать предметы в стеки, которые затем будут помещаться в очередь.

Вывод для стеков будет:

Lift1 :t1,t2,t3,t4,t5,t6,t7 Lift2 :t8,t10,t11,t12,t13,t14

Мой код:

public static void main(String[] args) 
    {



         ECFile ecf = new ECFile();

         Stack<String> lift1 = new Stack<>();
         Stack<String> lift2 = new Stack<>();
         Queue<String> Conveyer = new LinkedList<>();
         BlockingQueue<String> bq1 = new ArrayBlockingQueue<>(7);


         String[] cargo = ecf.getArray("ConstructionData6.txt");
         ecf.displayArray(cargo,"");

         int food      = 0;
         int materials  = 0;
         int tools = 0;
         int other     = 0;

         bq1.offer("test");

         for (int k=0; k<cargo.length; k++)
          {

              switch(cargo[k].substring(0,1)) 
               {
                  case  "F" : food++;
                              break;         
                  case  "M" : materials++;
                              break;
                  case  "T" : tools++;
                              break;    
                  default   : other++;
                               break;
               }
          }

            System.out.println("\nFood    :  "+food);
            System.out.println("Materials : "+materials);
            System.out.println("Tools    : "+tools);
            System.out.println("Errors   : "+other + "\n");




            for(int k=0; k<cargo.length; k++) 
            {
                if(k < 7)
                {
                    lift1.push(cargo[k]);
                }
                else if(k < 14)
                {
                    lift2.push(cargo[k]);
                }



            }


            System.out.println("Lift Cargo: ");
            System.out.println("lift1: " +lift1); 
            System.out.println("lift2: " +lift2);


    }

Мой цикл помещает данные в стеки, но если элементов больше, чем они могут вместить, элементы получаютпотерял.

1 Ответ

0 голосов
/ 04 октября 2019

Насколько я понимаю, вопрос:

Вы подаете элементы в два стека, максимальная вместимость которых составляет 7, любые элементы, которые не подаются в стеки, они идут в очередь.

for each item in cargo:
  can I put it in the first stack?
  else can I put in the second stack?
  else put in the queue.

вот несколько кодовых указателей:

if (lift1.size() < MAX_SIZE) {
   lift1.push(cargo[k]);
else if (lift2.size() < MAX_SIZE) {
  ....

Редактировать: на основе комментария ниже.

Итак, вам необходимо отслеживать, разрешено ли стеку получать элементы. Если стек находится в состоянии опустошения, вам нужно поместить элементы в следующий стек, а если второй стек переходит в состояние опустошения, вы переходите в первый стек.

вам нужна структура, чтобы сохранить состояние вашего стека (лифт). Вы можете создать класс-оболочку или иметь массив для хранения состояний.

Например:

class Lift {
 int capacity;
 boolean emptying;
 Stack<String> stack = new Stack<>();

 public Lift(int maxCapacity) {
  this.capacity = maxCapacity;
  this.emptying = false;
 }


 public boolean push(String item) {
  if (!emptying && stack.size() < capacity) {
    stack.push(item);
    return true;
  } else {
     //state is emptying
     emptying = true;
     return false
  }
 }

 public void pushtoQueue(Queue queue) {
   while(!stack.isEmpty()) {
     queue.add(stack.pop();
   }
   emptying = false;
 }

}

и тогда ваш основной цикл будет

boolean result1 = lift1.push(cargo[k]);
if (!result1) {
  lift2.push(cargo[k]);
} 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...