datatype Priority =
New of int
| con of Priority * int *int
;
fun empty (New(n)) = true
| empty (con(S,v,p)) = false
;
fun max (New(n)) = n
| max (con(S,v,p)) = max(S)
;
fun size (New(n)) = 0
| size (con(S,v,p)) = if size(S)=max(S)
then max(S)
else size(S)+1
;
exception topEmptyStack;
fun topp (New(n)) = raise topEmptyStack
| topp (con(S,v,p)) = p ;
fun topv (New(n)) = raise topEmptyStack
| topv (con(S,v,p)) = v ;
fun pop (New(n)) = New(n)
| pop (con(S,v,p)) =S;
fun push (New(n),v,p)=con(New(n),v,p)|
push(con(S,v2,p2),v,p) =if p2<=p
then con(con(S,v2,p2),v,p)
else con(push(S,v,p),v2,p2);
val ns5 = New(5);
val s1 = con(ns5,1, 2);
val s2 = con(s1,2,3 );
val s3 = con(s2,3,4 );
val s4 = con(s3,4,5 );
val s5 = con(s4,5,6 );
val s6 = con(s5,5,7 );
val s7 = con(s6,5,9 );
val s8 = push(s7,5,8);
New of int
| con of Priority * int *int
;
fun empty (New(n)) = true
| empty (con(S,v,p)) = false
;
fun max (New(n)) = n
| max (con(S,v,p)) = max(S)
;
fun size (New(n)) = 0
| size (con(S,v,p)) = if size(S)=max(S)
then max(S)
else size(S)+1
;
exception topEmptyStack;
fun topp (New(n)) = raise topEmptyStack
| topp (con(S,v,p)) = p ;
fun topv (New(n)) = raise topEmptyStack
| topv (con(S,v,p)) = v ;
fun pop (New(n)) = New(n)
| pop (con(S,v,p)) =S;
fun push (New(n),v,p)=con(New(n),v,p)|
push(con(S,v2,p2),v,p) =if p2<=p
then con(con(S,v2,p2),v,p)
else con(push(S,v,p),v2,p2);
val ns5 = New(5);
val s1 = con(ns5,1, 2);
val s2 = con(s1,2,3 );
val s3 = con(s2,3,4 );
val s4 = con(s3,4,5 );
val s5 = con(s4,5,6 );
val s6 = con(s5,5,7 );
val s7 = con(s6,5,9 );
val s8 = push(s7,5,8);