Advertisement
Guest User

[APS] Round Robin

a guest
Aug 22nd, 2019
520
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.18 KB | None | 0 0
  1. /* Да се имплементира Round Robin алгоритам. Се внесува број на процеси, потоа се внесуваат процесите како стринг составен од име,
  2. време на извршување, време на пристигнување. Се внесуват во ред. Потоа се внесува временскиот интервал кој му е дозволен за извршување
  3. на процесот.
  4. Sample input:
  5. 5
  6. A 40 2
  7. B 35 0
  8. C 28 10
  9. D 45 4
  10. E 32 2
  11. 10
  12.  
  13. Sample output:
  14. B A E D C B A E D C B A E D C B A E D D
  15. */
  16.  
  17. import java.io.BufferedReader;
  18. import java.io.IOException;
  19. import java.io.InputStreamReader;
  20. import java.util.NoSuchElementException;
  21.  
  22. class LinkedQueue<E> implements Queue<E> {
  23.  
  24.     // Redicata e pretstavena na sledniot nacin:
  25.     // length go sodrzi brojot na elementi.
  26.     // Elementite se zachuvuvaat vo jazli dod SLL
  27.     // front i rear se linkovi do prviot i posledniot jazel soodvetno.
  28.     SLLNode<E> front, rear;
  29.     int length;
  30.  
  31.     // Konstruktor ...
  32.  
  33.     public LinkedQueue () {
  34.         clear();
  35.     }
  36.  
  37.     public boolean isEmpty () {
  38.         // Vrakja true ako i samo ako redicata e prazena.
  39.         return (length == 0);
  40.     }
  41.  
  42.     public int size () {
  43.         // Ja vrakja dolzinata na redicata.
  44.         return length;
  45.     }
  46.  
  47.     public E peek () {
  48.         // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
  49.         if (front == null)
  50.             throw new NoSuchElementException();
  51.         return front.element;
  52.     }
  53.  
  54.     public void clear () {
  55.         // Ja prazni redicata.
  56.         front = rear = null;
  57.         length = 0;
  58.     }
  59.  
  60.     public void enqueue (E x) {
  61.         // Go dodava x na kraj od redicata.
  62.         SLLNode<E> latest = new SLLNode<E>(x, null);
  63.         if (rear != null) {
  64.             rear.succ = latest;
  65.             rear = latest;
  66.         } else
  67.             front = rear = latest;
  68.         length++;
  69.     }
  70.  
  71.     public E dequeue () {
  72.         // Go otstranuva i vrakja pochetniot element na redicata.
  73.         if (front != null) {
  74.             E frontmost = front.element;
  75.             front = front.succ;
  76.             if (front == null)  rear = null;
  77.             length--;
  78.             return frontmost;
  79.         } else
  80.             throw new NoSuchElementException();
  81.     }
  82.  
  83. }
  84.  
  85. interface Queue<E> {
  86.  
  87.     // Elementi na redicata se objekti od proizvolen tip.
  88.  
  89.     // Metodi za pristap:
  90.  
  91.     public boolean isEmpty ();
  92.     // Vrakja true ako i samo ako redicata e prazena.
  93.  
  94.     public int size ();
  95.     // Ja vrakja dolzinata na redicata.
  96.  
  97.     public E peek ();
  98.     // Go vrakja elementot na vrvot t.e. pocetokot od redicata.
  99.  
  100.     // Metodi za transformacija:
  101.  
  102.     public void clear ();
  103.     // Ja prazni redicata.
  104.  
  105.     public void enqueue (E x);
  106.     // Go dodava x na kraj od redicata.
  107.  
  108.     public E dequeue ();
  109.     // Go otstranuva i vrakja pochetniot element na redicata.
  110.  
  111. }
  112.  
  113. class SLLNode<E> {
  114.     protected E element;
  115.     protected SLLNode<E> succ;
  116.  
  117.     public SLLNode(E elem, SLLNode<E> succ) {
  118.         this.element = elem;
  119.         this.succ = succ;
  120.     }
  121.  
  122.     @Override
  123.     public String toString() {
  124.         return element.toString();
  125.     }
  126. }
  127.  
  128. class Process {
  129.     protected String name;
  130.     protected int vremeIzvrshuvanje;
  131.     protected int vremePristignuvanje;
  132.  
  133.     public String getName(){
  134.         return name;
  135.     }
  136.  
  137.     public int getVremeIzvrshuvanje(){
  138.         return vremeIzvrshuvanje;
  139.     }
  140.  
  141.     public int getVremePristignuvanje(){
  142.         return vremePristignuvanje;
  143.     }
  144.  
  145.     public Process(String name, int vremeIzvrshuvanje, int vremePristignuvanje){
  146.         this.name = name;
  147.         this.vremeIzvrshuvanje = vremeIzvrshuvanje;
  148.         this.vremePristignuvanje = vremePristignuvanje;
  149.     }
  150.  
  151.     @Override
  152.     public String toString(){
  153.         return String.format("%s ",name);
  154.     }
  155. }
  156.  
  157.  
  158. public class RoundRobin {
  159.     public static void main (String [] args) throws IOException {
  160.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  161.         int brProcesi = Integer.parseInt(br.readLine());
  162.         LinkedQueue<Process> procesiRed = new LinkedQueue<>();
  163.  
  164.         for(int i=0; i<brProcesi; i++){
  165.             String line = br.readLine();
  166.             String [] parts = line.split(" ");
  167.             String name = parts[0];
  168.             int vremeIzvrshuvanje = Integer.parseInt(parts[1]);
  169.             int vremePristignuvanje = Integer.parseInt(parts[2]);
  170.             Process process = new Process(name,vremeIzvrshuvanje,vremePristignuvanje);
  171.             procesiRed.enqueue(process);
  172.         }
  173.  
  174.         int interval = Integer.parseInt(br.readLine());
  175.  
  176.         LinkedQueue<Process> procesiRedFinal = new LinkedQueue<>();
  177.  
  178.         while(brProcesi!=0) {
  179.             Process najmal = procesiRed.peek();
  180.             for (int i = 0; i < brProcesi; i++) {
  181.                 Process var = procesiRed.dequeue();
  182.                 if (najmal.getVremePristignuvanje() > var.getVremePristignuvanje()) {
  183.                     najmal = var;
  184.                     procesiRed.enqueue(var);
  185.                 } else if (najmal.getVremePristignuvanje() == var.getVremePristignuvanje()) {
  186.                     if (var.getVremeIzvrshuvanje() > najmal.getVremeIzvrshuvanje()) {
  187.                         najmal = var;
  188.                         procesiRed.enqueue(var);
  189.                     } else {
  190.                         procesiRed.enqueue(var);
  191.                     }
  192.                 } else {
  193.                     procesiRed.enqueue(var);
  194.                 }
  195.             }
  196.             procesiRedFinal.enqueue(najmal);
  197.             for (int i = 0; i < brProcesi; i++) {
  198.                 Process var = procesiRed.dequeue();
  199.                 if (var != najmal) {
  200.                     procesiRed.enqueue(var);
  201.                 }
  202.             }
  203.             brProcesi--;
  204.         }
  205.  
  206.         while(!procesiRedFinal.isEmpty()){
  207.             Process var = procesiRedFinal.dequeue();
  208.             System.out.printf("%s ",var.getName());
  209.             var.vremeIzvrshuvanje -= interval;
  210.             if(var.vremeIzvrshuvanje>0)
  211.                 procesiRedFinal.enqueue(var);
  212.         }
  213.     }
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement