from copy import deepcopy
class Stack:
def __init__ ( self ) :
self ._values = [ ]
return
def is_empty( self ) :
if self ._values == [ ] :
r = True
else :
r= False
return r
def push( self , value) :
self ._values.append ( deepcopy( value) )
return
def pop( self ) :
assert len ( self ._values) > 0 , "Cannot pop from an empty stack"
value= self ._values.pop ( )
return value
def peek( self ) :
assert len ( self ._values) > 0 , "Cannot peek at an empty stack"
value= self ._values[ -1 ]
return value
def reroute( opstring, values_in) :
"""
-------------------------------------------------------
Reroutes values in a list according to a operating string and
returns a new list of values. values_in is unchanged.
In opstring, 'X' means push onto stack,
'S' means pop from stack into values_out.
Use: values_out = reroute(opstring, values_in)
-------------------------------------------------------
Preconditions:
opstring - String containing only 'S' and 'X's (str)
values_in - A valid list (list of ?)
Postconditions:
returns
values_out - if opstring is valid then values_out contains a
reordered version of values_in, otherwise returns
None (list of ?)
-------------------------------------------------------
"""
st= Stack( )
vo= [ ]
i= 0
j= 0
while i< len ( opstring) :
if opstring[ i] == 'X' :
st.push ( values_in[ j] )
j+= 1
elif opstring[ i] == 'S' :
if st.is_empty ( ) == False :
vo= vo.append ( st.pop ( ) )
else :
return None
i+= 1
return vo
out= [ ]
out= reroute( "XXSSXXSS" , [ 1 , 2 , 3 , 4 ] )
print out
ZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQpjbGFzcyBTdGFjazoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl92YWx1ZXMgPSBbXQogICAgICAgIHJldHVybgoKICAgIGRlZiBpc19lbXB0eShzZWxmKToKICAgICAgICBpZiBzZWxmLl92YWx1ZXMgPT0gW106CiAgICAgICAgICAgIHIgPSBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcj1GYWxzZQogICAgICAgIHJldHVybiByCgogICAgZGVmIHB1c2goc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ZhbHVlcy5hcHBlbmQoZGVlcGNvcHkodmFsdWUpKQogICAgICAgIHJldHVybgoKICAgIGRlZiBwb3Aoc2VsZik6CiAgICAgICAgYXNzZXJ0IGxlbihzZWxmLl92YWx1ZXMpID4gMCwgIkNhbm5vdCBwb3AgZnJvbSBhbiBlbXB0eSBzdGFjayIKICAgICAgICB2YWx1ZT1zZWxmLl92YWx1ZXMucG9wKCkKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBkZWYgcGVlayhzZWxmKToKICAgICAgICBhc3NlcnQgbGVuKHNlbGYuX3ZhbHVlcykgPiAwLCAiQ2Fubm90IHBlZWsgYXQgYW4gZW1wdHkgc3RhY2siCiAgICAgICAgdmFsdWU9c2VsZi5fdmFsdWVzWy0xXQogICAgICAgIHJldHVybiB2YWx1ZQogICAgICAgIApkZWYgcmVyb3V0ZShvcHN0cmluZywgdmFsdWVzX2luKToKICAgICIiIgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmVyb3V0ZXMgdmFsdWVzIGluIGEgbGlzdCBhY2NvcmRpbmcgdG8gYSBvcGVyYXRpbmcgc3RyaW5nIGFuZAogICAgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHZhbHVlcy4gdmFsdWVzX2luIGlzIHVuY2hhbmdlZC4KICAgIEluIG9wc3RyaW5nLCAnWCcgbWVhbnMgcHVzaCBvbnRvIHN0YWNrLAogICAgJ1MnIG1lYW5zIHBvcCBmcm9tIHN0YWNrIGludG8gdmFsdWVzX291dC4KICAgIFVzZTogdmFsdWVzX291dCA9IHJlcm91dGUob3BzdHJpbmcsIHZhbHVlc19pbikKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFByZWNvbmRpdGlvbnM6CiAgICAgICAgb3BzdHJpbmcgLSBTdHJpbmcgY29udGFpbmluZyBvbmx5ICdTJyBhbmQgJ1gncyAoc3RyKQogICAgICAgIHZhbHVlc19pbiAtIEEgdmFsaWQgbGlzdCAobGlzdCBvZiA/KQogICAgUG9zdGNvbmRpdGlvbnM6CiAgICAgICAgcmV0dXJucwogICAgICAgIHZhbHVlc19vdXQgLSBpZiBvcHN0cmluZyBpcyB2YWxpZCB0aGVuIHZhbHVlc19vdXQgY29udGFpbnMgYQogICAgICAgICAgICByZW9yZGVyZWQgdmVyc2lvbiBvZiB2YWx1ZXNfaW4sIG90aGVyd2lzZSByZXR1cm5zIAogICAgICAgICAgICBOb25lIChsaXN0IG9mID8pCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAiIiIKICAgIHN0PVN0YWNrKCkKICAgIHZvPVtdCiAgICBpPTAKICAgIGo9MAogICAgd2hpbGUgaTxsZW4ob3BzdHJpbmcpOgogICAgCWlmIG9wc3RyaW5nW2ldPT0nWCc6CiAgICAJCXN0LnB1c2godmFsdWVzX2luW2pdKQogICAgCQlqKz0xCiAgICAJZWxpZiBvcHN0cmluZ1tpXT09J1MnOgogICAgCQlpZiBzdC5pc19lbXB0eSgpPT1GYWxzZToKICAgIAkJCXZvPXZvLmFwcGVuZChzdC5wb3AoKSkKICAgIAkJZWxzZToKICAgIAkJCXJldHVybiBOb25lCiAgICAJaSs9MQogICAgcmV0dXJuIHZvCiAgIApvdXQ9W10Kb3V0PSByZXJvdXRlKCJYWFNTWFhTUyIsWzEsMiwzLDRdKQpwcmludCBvdXQ=