248 lines
6.5 KiB
COBOL
248 lines
6.5 KiB
COBOL
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. push.
|
|
DATA DIVISION.
|
|
LOCAL-STORAGE SECTION.
|
|
COPY p.
|
|
COPY node.
|
|
LINKAGE SECTION.
|
|
COPY stack.
|
|
01 node-info-any PICTURE X ANY LENGTH.
|
|
PROCEDURE DIVISION USING stack node-info-any.
|
|
ALLOCATE node
|
|
CALL "pointerp" USING
|
|
BY REFERENCE ADDRESS OF node
|
|
BY REFERENCE p
|
|
END-CALL
|
|
IF nil
|
|
CALL "stack-overflow-error" END-CALL
|
|
ELSE
|
|
MOVE node-info-any TO info OF node
|
|
SET link OF node TO head OF stack
|
|
SET head OF stack TO ADDRESS OF node
|
|
END-IF
|
|
GOBACK.
|
|
END PROGRAM push.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. pop.
|
|
DATA DIVISION.
|
|
LOCAL-STORAGE SECTION.
|
|
COPY p.
|
|
COPY node.
|
|
LINKAGE SECTION.
|
|
COPY stack.
|
|
COPY node-info.
|
|
PROCEDURE DIVISION USING stack node-info.
|
|
CALL "empty" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE p
|
|
END-CALL
|
|
IF t
|
|
CALL "stack-underflow-error" END-CALL
|
|
ELSE
|
|
SET ADDRESS OF node TO head OF stack
|
|
SET head OF stack TO link OF node
|
|
MOVE info OF node TO node-info
|
|
END-IF
|
|
FREE ADDRESS OF node
|
|
GOBACK.
|
|
END PROGRAM pop.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. empty.
|
|
DATA DIVISION.
|
|
LOCAL-STORAGE SECTION.
|
|
LINKAGE SECTION.
|
|
COPY stack.
|
|
COPY p.
|
|
PROCEDURE DIVISION USING stack p.
|
|
CALL "pointerp" USING
|
|
BY CONTENT head OF stack
|
|
BY REFERENCE p
|
|
END-CALL
|
|
IF t
|
|
SET t TO FALSE
|
|
ELSE
|
|
SET t TO TRUE
|
|
END-IF
|
|
GOBACK.
|
|
END PROGRAM empty.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. head.
|
|
DATA DIVISION.
|
|
LOCAL-STORAGE SECTION.
|
|
COPY p.
|
|
COPY node.
|
|
LINKAGE SECTION.
|
|
COPY stack.
|
|
COPY node-info.
|
|
PROCEDURE DIVISION USING stack node-info.
|
|
CALL "empty" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE p
|
|
END-CALL
|
|
IF t
|
|
CALL "stack-underflow-error" END-CALL
|
|
ELSE
|
|
SET ADDRESS OF node TO head OF stack
|
|
MOVE info OF node TO node-info
|
|
END-IF
|
|
GOBACK.
|
|
END PROGRAM head.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. peek.
|
|
DATA DIVISION.
|
|
LOCAL-STORAGE SECTION.
|
|
LINKAGE SECTION.
|
|
COPY stack.
|
|
COPY node-info.
|
|
PROCEDURE DIVISION USING stack node-info.
|
|
CALL "head" USING
|
|
BY CONTENT stack
|
|
BY REFERENCE node-info
|
|
END-CALL
|
|
GOBACK.
|
|
END PROGRAM peek.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. pointerp.
|
|
DATA DIVISION.
|
|
LINKAGE SECTION.
|
|
01 test-pointer USAGE IS POINTER.
|
|
COPY p.
|
|
PROCEDURE DIVISION USING test-pointer p.
|
|
IF test-pointer EQUAL NULL
|
|
SET nil TO TRUE
|
|
ELSE
|
|
SET t TO TRUE
|
|
END-IF
|
|
GOBACK.
|
|
END PROGRAM pointerp.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. stack-overflow-error.
|
|
PROCEDURE DIVISION.
|
|
DISPLAY "stack-overflow-error" END-DISPLAY
|
|
STOP RUN.
|
|
END PROGRAM stack-overflow-error.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. stack-underflow-error.
|
|
PROCEDURE DIVISION.
|
|
DISPLAY "stack-underflow-error" END-DISPLAY
|
|
STOP RUN.
|
|
END PROGRAM stack-underflow-error.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. copy-stack.
|
|
DATA DIVISION.
|
|
LOCAL-STORAGE SECTION.
|
|
COPY p.
|
|
COPY node-info.
|
|
LINKAGE SECTION.
|
|
COPY stack.
|
|
COPY stack REPLACING stack BY new-stack.
|
|
PROCEDURE DIVISION USING stack new-stack.
|
|
CALL "empty" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE p
|
|
END-CALL
|
|
IF nil
|
|
CALL "pop" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE node-info
|
|
END-CALL
|
|
CALL "copy-stack" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE new-stack
|
|
END-CALL
|
|
CALL "push" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE node-info
|
|
END-CALL
|
|
CALL "push" USING
|
|
BY REFERENCE new-stack
|
|
BY REFERENCE node-info
|
|
END-CALL
|
|
END-IF
|
|
GOBACK.
|
|
END PROGRAM copy-stack.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. reverse-stack.
|
|
DATA DIVISION.
|
|
LOCAL-STORAGE SECTION.
|
|
COPY p.
|
|
COPY node-info.
|
|
LINKAGE SECTION.
|
|
COPY stack.
|
|
COPY stack REPLACING stack BY new-stack.
|
|
PROCEDURE DIVISION USING stack new-stack.
|
|
CALL "empty" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE p
|
|
END-CALL
|
|
IF nil
|
|
CALL "pop" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE node-info
|
|
END-CALL
|
|
CALL "push" USING
|
|
BY REFERENCE new-stack
|
|
BY REFERENCE node-info
|
|
END-CALL
|
|
CALL "reverse-stack" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE new-stack
|
|
END-CALL
|
|
CALL "push" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE node-info
|
|
END-CALL
|
|
END-IF
|
|
GOBACK.
|
|
END PROGRAM reverse-stack.
|
|
|
|
IDENTIFICATION DIVISION.
|
|
PROGRAM-ID. traverse-stack.
|
|
DATA DIVISION.
|
|
LOCAL-STORAGE SECTION.
|
|
COPY p.
|
|
COPY node-info.
|
|
COPY stack REPLACING stack BY new-stack.
|
|
LINKAGE SECTION.
|
|
COPY stack.
|
|
PROCEDURE DIVISION USING stack.
|
|
CALL "copy-stack" USING
|
|
BY REFERENCE stack
|
|
BY REFERENCE new-stack
|
|
END-CALL
|
|
CALL "empty" USING
|
|
BY REFERENCE new-stack
|
|
BY REFERENCE p
|
|
END-CALL
|
|
IF nil
|
|
CALL "head" USING
|
|
BY CONTENT new-stack
|
|
BY REFERENCE node-info
|
|
END-CALL
|
|
DISPLAY node-info END-DISPLAY
|
|
CALL "peek" USING
|
|
BY CONTENT new-stack
|
|
BY REFERENCE node-info
|
|
END-CALL
|
|
DISPLAY node-info END-DISPLAY
|
|
CALL "pop" USING
|
|
BY REFERENCE new-stack
|
|
BY REFERENCE node-info
|
|
END-CALL
|
|
DISPLAY node-info END-DISPLAY
|
|
CALL "traverse-stack" USING
|
|
BY REFERENCE new-stack
|
|
END-CALL
|
|
END-IF
|
|
GOBACK.
|
|
END PROGRAM traverse-stack.
|