Liste, Code, Pile Informatica 3 - Esercitazioni 1 Problema Sei il titolare di un agenzia matrimoniale e devi assicurarti che le coppie da te create siano coppie stabili. Ci sono tante donne quanti uomini Ciascuno ordina tutti gli altri iscritti all agenzia a seconda della sua preferenza Come garantire il funzionamento dei matrimoni? Informatica 3 - Esercitazioni 2 1
Idea Per evitare che una coppia si separi bisogna evitare che ci siano: una coppia 1 formata da u1 e d1 una coppia 2 formata da u2 e d2 in cui u1 preferisca d2 a d1 e d2 preferisca u1 a suo marito u2. Se questo non accade, non può succedere che una coppia si lasci, perché se anche una persona non è sposata con la sua prima scelta, non c è una persona che preferisce e che la preferisce al consorte Informatica 3 - Esercitazioni 3 Classe PersonList public class PersonList { public Object person; public PersonList next; PersonList(Object p, PersonList next) { person = p; this.next = next; if (next == null) return person.tostring(); return ("" + person.tostring() + " " + next); Informatica 3 - Esercitazioni 4 2
Classe Man public class Man { String name; PersonList list; // pila public Man(String name) { this.name = name; list = null; public void push(woman w) { // gestisce le preferenze con una pila list = new PersonList(w, list); public Woman pop() { Object top = list.person; list = list.next; return (Woman) top; public String getlist() { return list.tostring(); return name; Informatica 3 - Esercitazioni 5 Classe Woman (1) public class Woman { String name; PersonList list; // testa PersonList rear; // ultimo elemento (coda) public Woman(String name) { this.name = name; list = null; rear = null; public void add(man w) { // gestisce gli uomini come una coda if (list == null) { list = new PersonList(w, list); rear = list; { rear.next = new PersonList(w, null); rear = rear.next; Informatica 3 - Esercitazioni 6 3
public boolean likes(man m) { PersonList ls = list; while ((ls!= null) && (ls.person!= m)) ls = ls.next; return (ls!= null); public void trimlist(man m) { // suppone che list contenga m if (list.person == m) { list = null; rear = null; { PersonList ls = list; while (ls.next.person!= m) ls = ls.next; ls.next = null; // molla m e tutti quelli sotto rear = ls; public String getlist() { if (list == null) return "nessuno"; return list.tostring(); return name; Informatica 3 - Esercitazioni 7 class Association { Object domain; Object range; Association next; Classe Association public Association(Object d, Object r, Association next) { domain = d; range = r; this.next = next; return ( "(" + domain + "," + range + ")" ); Informatica 3 - Esercitazioni 8 4
public class Relation { Association list; Classe Relation public Relation() { list = new Association(null, null, null); Association find(object target) { // return Assocation _before_ target in list Association cur = list; while ((cur.next!= null) && (cur.next.domain!= target)) cur = cur.next; return cur; Informatica 3 - Esercitazioni 9 public void map(object d, Object r) { Association onebefore = find(d); if (onebefore.next == null) // didn't find it, so append new item to list end onebefore.next = new Association(d, r, null); // did find it, so replace range onebefore.next.range = r; public Object lookup(object d) { Association onebefore = find(d); if (onebefore.next == null) // didn't find it, return null return null; return onebefore.next.range; String result = "("; Association cur = list; while (cur.next!= null) { result = result + cur.next; cur = cur.next; return result + ")"; Informatica 3 - Esercitazioni 10 5
Classe StableMarriage public class StableMarriage { public static void main(string args[]) { test(); public static void test() { Man giovanni, mattia, vincenzo, pietro; Woman barbara, francesca, chiara, elisa; giovanni = new Man("giovanni"); mattia = new Man("mattia"); vincenzo = new Man("vincenzo"); pietro = new Man("pietro"); barbara = new Woman("barbara"); francesca = new Woman("francesca"); chiara = new Woman("chiara"); elisa = new Woman("elisa"); Informatica 3 - Esercitazioni 11 // NB pila: dalla peggiore alla migliore giovanni.push(francesca); giovanni.push(chiara); giovanni.push(barbara); giovanni.push(elisa); mattia.push(barbara); mattia.push(elisa); mattia.push(francesca); mattia.push(chiara); vincenzo.push(francesca); vincenzo.push(chiara); vincenzo.push(barbara); vincenzo.push(elisa); pietro.push(francesca); pietro.push(chiara); pietro.push(barbara); pietro.push(elisa); // NB coda: in ordine di preferenza barbara.add(mattia); barbara.add(pietro); barbara.add(vincenzo); barbara.add(giovanni); elisa.add(mattia); elisa.add(giovanni); elisa.add(pietro); elisa.add(vincenzo); francesca.add(giovanni); francesca.add(mattia); francesca.add(pietro); francesca.add(vincenzo); chiara.add(mattia); chiara.add(giovanni); chiara.add(pietro); chiara.add(vincenzo); PersonList eligible = new PersonList(vincenzo, new PersonList(pietro, new PersonList(mattia, new PersonList(giovanni,null)))); System.out.println("" + findmarriages(eligible)); Informatica 3 - Esercitazioni 12 6
public static Relation findmarriages(personlist eligible) { Relation couples = new Relation(); while (eligible!= null) { Man m = (Man) eligible.person; Woman w = m.pop(); System.out.println("" + m + " si propone a " + w); if (w.likes(m)) { System.out.print(" lei accetta "); Man oldhusband = (Man) couples.lookup(w); if (oldhusband == null) eligible = eligible.next; { System.out.print("(lasciando " + oldhusband + ")"); eligible = new PersonList(oldHusband, eligible.next); couples.map(w,m); w.trimlist(m); System.out.println("\n ma tuttora preferisce: " + w.getlist()); return couples; Informatica 3 - Esercitazioni 13 Output vincenzo si propone a elisa, lei accetta, ma tuttora preferisce: mattia giovanni pietro pietro si propone a elisa, lei accetta (lasciando vincenzo), ma tuttora preferisce: mattia giovanni vincenzo si propone a barbara, lei accetta, ma tuttora preferisce: mattia pietro mattia si propone a chiara, lei accetta, ma tuttora preferisce: nessuno giovanni si propone a elisa, lei accetta (lasciando pietro), ma tuttora preferisce: mattia pietro si propone a barbara, lei accetta (lasciando vincenzo), ma tuttora preferisce: mattia vincenzo si propone a chiara vincenzo si propone a francesca, lei accetta, ma tuttora preferisce: giovanni mattia pietro ((elisa,giovanni)(barbara,pietro)(chiara,mattia)(francesca,vincenzo)) Informatica 3 - Esercitazioni 14 7