MODULE STACK_MODULE
IMPLICIT NONE
TYPE ELEMENT_TYPE
INTEGER(4) :: VAL
TYPE(ELEMENT_TYPE), POINTER :: PREV
END TYPE ELEMENT_TYPE
TYPE STACK_TYPE
INTEGER(4) :: SIZE=0
TYPE(ELEMENT_TYPE), POINTER :: LASTIN => NULL()
END TYPE STACK_TYPE
CONTAINS
SUBROUTINE PUSH(VAL_,STACK)
IMPLICIT NONE
INTEGER(4), INTENT(IN) :: VAL_
TYPE(STACK_TYPE), INTENT(INOUT) :: STACK
TYPE(ELEMENT_TYPE),POINTER :: CURRENT
! INIT CURRENT
ALLOCATE(CURRENT)
CURRENT%VAL = VAL_
CURRENT%PREV => STACK%LASTIN
! ADD CURRENT TO STACK
STACK%LASTIN => CURRENT
STACK%SIZE = STACK%SIZE+1
RETURN
END SUBROUTINE PUSH
SUBROUTINE POP(STACK,VAL_)
IMPLICIT NONE
TYPE(STACK_TYPE), INTENT(INOUT) :: STACK
INTEGER(4) , INTENT(OUT) :: VAL_
TYPE(ELEMENT_TYPE), POINTER :: B4LASTIN
!WRITE TO VAL_
IF (ASSOCIATED(STACK%LASTIN)) THEN
VAL_ = STACK%LASTIN%VAL
!TAKE OUT THE LAST-IN ELEMENT
B4LASTIN => STACK%LASTIN%PREV
DEALLOCATE(STACK%LASTIN)
STACK%LASTIN => B4LASTIN
STACK%SIZE = STACK%SIZE-1
ELSE
IF (STACK%SIZE.NE.0) THEN
PRINT*, STACK%SIZE
STOP 'MISMATCH BETWEEN STACKSIZE AND POINTER: BAD BOOK KEEPING!'
END IF
END IF
RETURN
END SUBROUTINE POP
END MODULE STACK_MODULE
PROGRAM MAIN
USE STACK_MODULE
IMPLICIT NONE
INTEGER(4) :: I,J
TYPE(STACK_TYPE) :: STACK1
!STACK1%LASTIN => NULL()
DO I = 1,10
CALL PUSH(I,STACK1)
END DO
DO WHILE (ASSOCIATED(STACK1%LASTIN))
CALL POP(STACK1,J)
PRINT*, J
END DO
END PROGRAM
TU9EVUxFIFNUQUNLX01PRFVMRQogSU1QTElDSVQgTk9ORQogCiBUWVBFIEVMRU1FTlRfVFlQRQogIElOVEVHRVIoNCkgOjogVkFMCiAgVFlQRShFTEVNRU5UX1RZUEUpLCBQT0lOVEVSIDo6IFBSRVYKIEVORCBUWVBFIEVMRU1FTlRfVFlQRQogCiBUWVBFIFNUQUNLX1RZUEUKICBJTlRFR0VSKDQpIDo6IFNJWkU9MAogIFRZUEUoRUxFTUVOVF9UWVBFKSwgUE9JTlRFUiA6OiBMQVNUSU4gPT4gTlVMTCgpCiBFTkQgVFlQRSBTVEFDS19UWVBFCiAKIENPTlRBSU5TCiAgU1VCUk9VVElORSBQVVNIKFZBTF8sU1RBQ0spCiAgIElNUExJQ0lUIE5PTkUKICAgSU5URUdFUig0KSwgSU5URU5UKElOKSA6OiBWQUxfCiAgIFRZUEUoU1RBQ0tfVFlQRSksIElOVEVOVChJTk9VVCkgOjogU1RBQ0sKICAgVFlQRShFTEVNRU5UX1RZUEUpLFBPSU5URVIgICAgICAgOjogQ1VSUkVOVAogICAhIElOSVQgQ1VSUkVOVAogICBBTExPQ0FURShDVVJSRU5UKQogICBDVVJSRU5UJVZBTCA9IFZBTF8KICAgQ1VSUkVOVCVQUkVWID0+IFNUQUNLJUxBU1RJTgogICAhIEFERCBDVVJSRU5UIFRPIFNUQUNLCiAgIFNUQUNLJUxBU1RJTiA9PiBDVVJSRU5UCiAgIFNUQUNLJVNJWkUgPSBTVEFDSyVTSVpFKzEKICAgUkVUVVJOCiAgRU5EIFNVQlJPVVRJTkUgUFVTSAogIAogIFNVQlJPVVRJTkUgUE9QKFNUQUNLLFZBTF8pCiAgIElNUExJQ0lUIE5PTkUKICAgVFlQRShTVEFDS19UWVBFKSwgSU5URU5UKElOT1VUKSA6OiBTVEFDSwogICBJTlRFR0VSKDQpICAgICAgLCBJTlRFTlQoT1VUKSAgIDo6IFZBTF8KICAgVFlQRShFTEVNRU5UX1RZUEUpLCBQT0lOVEVSICAgICA6OiBCNExBU1RJTgogICAhV1JJVEUgVE8gVkFMXwogICBJRiAoQVNTT0NJQVRFRChTVEFDSyVMQVNUSU4pKSBUSEVOCiAgICBWQUxfID0gU1RBQ0slTEFTVElOJVZBTAogICAgIVRBS0UgT1VUIFRIRSBMQVNULUlOIEVMRU1FTlQKICAgIEI0TEFTVElOID0+IFNUQUNLJUxBU1RJTiVQUkVWCiAgICBERUFMTE9DQVRFKFNUQUNLJUxBU1RJTikKICAgIFNUQUNLJUxBU1RJTiA9PiBCNExBU1RJTgogICAgU1RBQ0slU0laRSA9IFNUQUNLJVNJWkUtMSAKICAgRUxTRQogICAgSUYgKFNUQUNLJVNJWkUuTkUuMCkgVEhFTgogICAgIFBSSU5UKiwgU1RBQ0slU0laRQogICAgIFNUT1AgJ01JU01BVENIIEJFVFdFRU4gU1RBQ0tTSVpFIEFORCBQT0lOVEVSOiBCQUQgQk9PSyBLRUVQSU5HIScKICAgIEVORCBJRgogICBFTkQgSUYKICAgUkVUVVJOCiAgRU5EIFNVQlJPVVRJTkUgUE9QIApFTkQgTU9EVUxFIFNUQUNLX01PRFVMRQoKUFJPR1JBTSBNQUlOCiBVU0UgU1RBQ0tfTU9EVUxFCiBJTVBMSUNJVCBOT05FCiBJTlRFR0VSKDQpIDo6IEksSgogVFlQRShTVEFDS19UWVBFKSA6OiBTVEFDSzEKICFTVEFDSzElTEFTVElOID0+IE5VTEwoKQogRE8gSSA9IDEsMTAKICBDQUxMIFBVU0goSSxTVEFDSzEpCiBFTkQgRE8KIERPIFdISUxFIChBU1NPQ0lBVEVEKFNUQUNLMSVMQVNUSU4pKQogIENBTEwgUE9QKFNUQUNLMSxKKQogIFBSSU5UKiwgSgogRU5EIERPCkVORCBQUk9HUkFN