swuecho
8/6/2012 - 5:24 PM

minstack @..pl

#todo how to use multi?
class Minstack {

    has @.stack;
    has @.min;
    

    method mpush($item) {
	push @.stack, $item;  
	if @.min==0 or @.min[*-1] > $item {
	    push @.min, $item;
	}
    }

    method mpop() {	
	my $item=pop @.stack;
	if $item == @.min[*-1] {
	    pop @.min;
	}
	return $item;
    }

    method mmin() {
	@.min[*-1];
    }

}



my $min=Minstack.new;
$min.mpush(5);
$min.mpush(3);
$min.mpush(10);
say $min.stack; #5 3 10
say $min.min; #5 3
say $min.mmin();#3
say $min.mpop(); #10
say $min.mmin();#3
=begin comment
=end comment


=begin comment
Why this version does not work?


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

=end comment


=begin comment

#if @.stack==0 {
#	    say "min stack is empty";
#	    return
#	}
=end comment