fork(2) download
  1. MODULE STACK_MODULE
  2. IMPLICIT NONE
  3.  
  4. TYPE ELEMENT_TYPE
  5. INTEGER(4) :: VAL
  6. TYPE(ELEMENT_TYPE), POINTER :: PREV
  7. END TYPE ELEMENT_TYPE
  8.  
  9. TYPE STACK_TYPE
  10. INTEGER(4) :: SIZE=0
  11. TYPE(ELEMENT_TYPE), POINTER :: LASTIN => NULL()
  12. END TYPE STACK_TYPE
  13.  
  14. CONTAINS
  15. SUBROUTINE PUSH(VAL_,STACK)
  16. IMPLICIT NONE
  17. INTEGER(4), INTENT(IN) :: VAL_
  18. TYPE(STACK_TYPE), INTENT(INOUT) :: STACK
  19. TYPE(ELEMENT_TYPE),POINTER :: CURRENT
  20. ! INIT CURRENT
  21. ALLOCATE(CURRENT)
  22. CURRENT%VAL = VAL_
  23. CURRENT%PREV => STACK%LASTIN
  24. ! ADD CURRENT TO STACK
  25. STACK%LASTIN => CURRENT
  26. STACK%SIZE = STACK%SIZE+1
  27. RETURN
  28. END SUBROUTINE PUSH
  29.  
  30. SUBROUTINE POP(STACK,VAL_)
  31. IMPLICIT NONE
  32. TYPE(STACK_TYPE), INTENT(INOUT) :: STACK
  33. INTEGER(4) , INTENT(OUT) :: VAL_
  34. TYPE(ELEMENT_TYPE), POINTER :: B4LASTIN
  35. !WRITE TO VAL_
  36. IF (ASSOCIATED(STACK%LASTIN)) THEN
  37. VAL_ = STACK%LASTIN%VAL
  38. !TAKE OUT THE LAST-IN ELEMENT
  39. B4LASTIN => STACK%LASTIN%PREV
  40. DEALLOCATE(STACK%LASTIN)
  41. STACK%LASTIN => B4LASTIN
  42. STACK%SIZE = STACK%SIZE-1
  43. ELSE
  44. IF (STACK%SIZE.NE.0) THEN
  45. PRINT*, STACK%SIZE
  46. STOP 'MISMATCH BETWEEN STACKSIZE AND POINTER: BAD BOOK KEEPING!'
  47. END IF
  48. END IF
  49. RETURN
  50. END SUBROUTINE POP
  51. END MODULE STACK_MODULE
  52.  
  53. PROGRAM MAIN
  54. USE STACK_MODULE
  55. IMPLICIT NONE
  56. INTEGER(4) :: I,J
  57. TYPE(STACK_TYPE) :: STACK1
  58. !STACK1%LASTIN => NULL()
  59. DO I = 1,10
  60. CALL PUSH(I,STACK1)
  61. END DO
  62. DO WHILE (ASSOCIATED(STACK1%LASTIN))
  63. CALL POP(STACK1,J)
  64. PRINT*, J
  65. END DO
  66. END PROGRAM
Success #stdin #stdout 0s 3984KB
stdin
Standard input is empty
stdout
          10
           9
           8
           7
           6
           5
           4
           3
           2
           1