{ From: Deavon@sound.demon.co.uk (Deavon Edwards) I am having some problem with this program. I would like to modified it to do the following.... i). To simulate the operation of a queue (Last In First Out). ii) To use a linked list instead of arrays(simulating a stack and queue). If anyone out there can help it would be greatly appreciated. This program will simulate the operation of a stack and a queue with a 10 items maximum. It will give the user the opportunity to insert and delete items from the data structures, display the data on screen, it on a printer, and save and load the data from a disk } PROGRAM StackSimulation(input, output); USES CRT,DOS,PRINTER; VAR Stack : ARRAY [1..10] OF STRING[20]; StackFull : BOOLEAN; StackEmpty : BOOLEAN; Pointer : INTEGER; Choice : CHAR; {*******************************************************************} PROCEDURE PressAKey; BEGIN WRITELN; WRITELN; WRITELN (' ************************************'); WRITELN (' *** PRESS RETURN TO CONTINUE ***'); WRITELN (' ************************************'); READLN; CLRSCR; END; {*******************************************************************} PROCEDURE Jump_a_Line(Jump: INTEGER); VAR Skip : INTEGER; BEGIN FOR Skip := 1 TO Jump DO WRITELN; END; {*******************************************************************} Procedure Introduction; {Display an introduction message to user} BEGIN CLRSCR; gotoxy (1,10); Textcolor(Cyan); writeln(' ********************************************************'); writeln(' ********************************************************'); writeln(' * *'); writeln(' * WELCOME TO STACK & QUEUE SIMULATION PROGRAM *'); writeln(' * *'); writeln(' ********************************************************'); writeln(' ********************************************************'); Jump_a_line(3); DELAY (1000); end; {*******************************************************************} PROCEDURE Initialise (VAR StackFull, StackEmpty : BOOLEAN); BEGIN CLRSCR; gotoxy (1,10); Jump_a_line(2); WRITELN (' ******************************************************'); WRITELN (' THE STACK IS INITIALISING...........PLEASE WAIT.......'); WRITELN (' ******************************************************'); Jump_a_line(3); SOUND (240); DELAY (1000); CLRSCR; NOSOUND; Pointer := 0; StackFull := FALSE; StackEmpty := TRUE; END; {*******************************************************************} PROCEDURE Add (VAR StackFull, StackEmpty : BOOLEAN); BEGIN IF StackFull THEN BEGIN gotoxy (1,10); Jump_a_line(2); WRITELN ('************************************************************'); WRITELN ('** SORRY, THE STACK IS FULL, NO MORE DATA CAN BE ENTERED ***'); WRITELN ('************************************************************'); Jump_a_line(3); PressAKey; END ELSE BEGIN INC (Pointer); Jump_a_line(3); WRITE ('PLEASE ENTER THE ITEM TO BE ADDED TO THE STACK :=> '); READLN (Stack [Pointer]); CLRSCR; IF StackEmpty THEN StackEmpty := FALSE; IF Pointer = 10 THEN StackFull := TRUE; END; END; {*******************************************************************} PROCEDURE Take (VAR StackFull, StackEmpty : BOOLEAN); BEGIN IF StackEmpty THEN BEGIN gotoxy (1,10); Jump_a_line(3); WRITELN (' *******************************************************'); WRITELN (' *** THE STACK IS EMPTY, NO MORE DATA CAN BE REMOVED ***'); WRITELN (' *******************************************************'); Jump_a_line(3); PressAKey; END ELSE BEGIN gotoxy (1,10); Jump_a_line(3); WRITE ('THE FOLLOWING ITEM HAVE BEEN REMOVE FROM THE STACK :=> '); WRITELN (Stack [Pointer]); DEC (Pointer); IF Pointer = 0 THEN StackEmpty := TRUE; IF StackFull THEN StackFull := FALSE; Jump_a_line(3); PressAKey; END; END; {*******************************************************************} PROCEDURE Display_to_Screen (StackEmpty : BOOLEAN); VAR Counter : INTEGER; BEGIN CLRSCR; GOTOXY (1,10); IF StackEmpty THEN WRITELN (' THE STACK IS CURRENTLY EMPTY '); Jump_a_Line (3); FOR Counter := 1 TO Pointer DO WRITELN (Counter:2 ,' ', Stack [Counter]); Jump_a_Line(2); PressAKey; END; {*******************************************************************} PROCEDURE Print_to_Printer (StackEmpty : BOOLEAN); VAR Counter : INTEGER; BEGIN CLRSCR; GOTOXY (1,10); {$I-} WRITELN (lst,#0); IF IORESULT <> 0 THEN WRITELN (' >>>>>> PRINTING ERROR.......PRINTER OFF LINE <<<<<< ') ELSE BEGIN IF StackEmpty THEN WRITELN ('THE STACK IS CURRENTLY EMPTY, THERE IS NO DATA TO BE PRINTED.') ELSE WRITELN (' THE CONTENTS OF THE STACK IS PRINTING........'); FOR Counter := Pointer DOWNTO 1 DO WRITELN (Lst,Counter:2 ,' ', Stack [Counter]); END; {$I+} PressAKey; END; {****************************************************} PROCEDURE Save_to_File; VAR Write_to_File : TEXT; Output_to_File : STRING[20]; Read_File : BOOLEAN; Counter : INTEGER; BEGIN CLRSCR; Jump_a_Line(3); WRITE('PLEASE ENTER THE NAME YOU WISH TO CALLED THE FILE :=> '); READLN(Output_to_File); ASSIGN(Write_to_File,Output_to_File); REWRITE(Write_to_File); FOR Counter := 1 TO Pointer DO BEGIN Writeln(Write_to_File,Stack[Counter]); Writeln('SAVING... ',Counter:2,' ... ',Stack[Counter]); END; CLOSE(Write_to_File); PressAKey; End; {**************************************************} PROCEDURE Open_A_File (StackEmpty : BOOLEAN); VAR Read_File : TEXT; Input_to_File : STRING[20]; BEGIN CLRSCR; Jump_a_Line(3); WRITE ('PLEASE ENTER THE NAME OF THE FILE YOU WHICH TO OPENED :=> '); READLN(Input_to_File); ASSIGN(Read_File,Input_to_File); {$I-} RESET(Read_File); IF IOResult = 0 THEN BEGIN Jump_a_Line(2); Pointer := 0; WHILE NOT EOF(Read_File) DO BEGIN INC (Pointer); READLN(Read_File,Stack [Pointer]); WRITELN(Pointer:2,' : ',Stack[Pointer]); END; CLOSE(Read_File); StackEmpty := FALSE; END ELSE CLRSCR; Jump_a_Line(2); WRITELN (' ***********************************'); WRITELN (' *** FILE NAME DOES NOT EXIT ***'); WRITELN (' ***********************************'); {$I+} PressAKey; END; {****************************************************} PROCEDURE Menu; BEGIN gotoxy (1,10); Textcolor(White); WRITELN (' **************************************************'); WRITELN (' **************************************************'); WRITELN (' **** A : Add to Stack *****'); WRITELN (' **** T : Take from Stack *****'); WRITELN (' **** D : Display Stack List to Screen *****'); WRITELN (' **** P : Print Stack List *****'); WRITELN (' **** I : Initialise Stack List *****'); WRITELN (' **** S : Save Stack to disk *****'); WRITELN (' **** L : Load Stack from disk *****'); WRITELN (' **** Q : Quit program *****'); WRITELN (' **************************************************'); WRITELN (' **************************************************'); WRITELN; WRITELN; WRITELN (' PLEASE ENTER AN OPTION >> '); Choice := READKEY; END; PROCEDURE QuitProgram; BEGIN gotoxy (1,10); WRITELN (' ***********************************'); WRITELN (' """""""""""""""""""""""""""""""""""'); WRITELN (' [[[[[ GOODBYE!!!!!! ]]]]] '); WRITELN (' """""""""""""""""""""""""""""""""""'); WRITELN (' ***********************************'); WRITELN; WRITELN; END; {*******************************************************************} {*******************************************************************} BEGIN Introduction; Initialise (StackFull, StackEmpty); REPEAT Menu; CLRSCR; CASE Choice OF 'A', 'a' : Add (StackFull, StackEmpty); 'T', 't' : Take (StackFull, StackEmpty); 'D', 'd' : Display_to_Screen (StackEmpty); 'P', 'p' : Print_to_Printer (StackEmpty); 'I', 'i' : Initialise (StackFull, StackEmpty); 'S', 's' : Save_to_File; 'L', 'l' : Open_a_File(StackEmpty); 'Q', 'q' : QuitProgram ELSE BEGIN gotoxy (1,10); WRITELN (' **************************'); WRITELN (' ** Invalid key pressed **'); WRITELN (' **************************'); WRITELN; PressAKey; END; END; UNTIL (Choice = 'Q') OR (Choice = 'q'); END.