swuecho
8/7/2012 - 1:57 AM

minstack_multi.pl

class Minstack {

        has @.stack;
        has @.min;
    
}
    multi push(Minstack $mstack, $item) {
	push $mstack.stack, $item;  
	if $mstack.min==0 or $mstack.min[*-1] > $item {
	    push $mstack.min, $item;
	}
    }

    multi pop(Minstack $mstack) {	
	my $item=pop $mstack.stack;
	if $item == $mstack.min[*-1] {
	    pop $mstack.min;
	}
	return $item;
    }

    multi min(Minstack $mstack) {
	$mstack.min[*-1];
    }


my $min=Minstack.new;
push $min, 5;
push $min, 3;
push $min, 10;
push $min, 2;
say(pop $min); # 2
say(min $min); # 3
say(pop $min); # 10
say(min $min); # 3
say(pop $min); # 3
say(min $min); # 5
say(pop $min); # 5