Skip to content

push/pop on a stack

4 messages · David Forrest, Marc Schwartz, Barry Rowlingson

#
Is there a package for stacks with pushing and popping?

I'd really like to do something like

push(par(no.readonly=TRUE))

 some stuff....

par(pop())

It seems like it wouldn't be difficult, and that someone may have already
implemented a set of stack functions, and I wouldn't like to duplicate it.

Thanks for your time,
Dave
#
In at least that particular example, the same save/restore operation
can be achieved by:

old.pars <- par(no.readonly=TRUE)

...other code

par(old.pars)

That is in the examples in ?par.


Not sure that you need a LIFO based stack mechanism for that unless I
am missing something.

HTH,

Marc Schwartz
#
Here's a Tuesday evening lash-up. Usage is:

  > mystack <- stack()   # initialisation
  > push(mystack,value)  # stores something on the stack
  > pop(mystack)         # returns 'value'

There's a print method that lists the stack. Its simply a list. Stack 
underflow is reported as 'attempt to select less than one element'. You 
can push anything on the stack. Almost. I just tried pushing a stack 
object onto the stack, and got infinite recursion, cant think why. 
Anyway, this seems to work for most sensible situations!


stack <- function(){

   it <- list()
   res <- list(
               push=function(x){
                 it[[length(it)+1]] <<- x
               },
               pop=function(){
                 val <- it[[length(it)]]
                 it <<- it[-length(it)]
                 return(val)
               },
               value=function(){
                 return(it)
               }
               )
   class(res) <- "stack"
   res

}

print.stack <- function(x,...){
   print(x$value())
}

push <- function(stack,obj){
   stack$push(obj)
}

pop <- function(stack){
   stack$pop()
}


Baz
#
to
Just as an FYI, if you should elect to implement that function, there
is already a stack() function in base R, so you would want to use a
different name.

See ?stack, which is used to transform data.

Regards,

Marc