Copyright (C) IOI日本委員会 1994. All rights reserved.


問題2.

以下の3つの異なる言語で書かれたプログラムは、 どれも同じ動作をし、同じ結果を出力する。 これらのプログラムに入力データとして英小文字だけからなる文字列

ioinihoniinkai

を入力したときの出力結果を答えよ。 ただし、文字コードは ASCII とする。 すなわち、 英小文字は a < b < c < ... < x < y < z と大小順が定められている。 [2点]


Cプログラム(2)


#include <stdio.h>
#define DEPTH 80

int stkPtr=0;
char stack[DEPTH];
void push(char);
char pop(void);

main()
{  
    char x;

    while ((x = getchar()) != '\n') {
        if (stkPtr==0) 
            push(x);
        else 
            if (x < stack[stkPtr-1]) 
                putchar(x);
            else 
                push(x);
    }
    while (stkPtr>0) 
        putchar(pop());
    exit(0);
}

void push(char x)
{  
    if (stkPtr<DEPTH) 
        stack[stkPtr++] = x;
    else {
        printf("\nStack overflow!\n");
        exit(1);
    }
}

char pop()
{  
    return stack[--stkPtr]; 
}


QuickBASICプログラム(2)


DECLARE SUB push(x)
DECLARE FUNCTION pop()
CONST DEPTH=80
DIM SHARED stack(DEPTH) AS INTEGER
DIM SHARED stkPtr AS INTEGER

    stkPtr=0
    LINE INPUT s$: L=LEN(s$)
    FOR i=1 TO L
        x=ASC(MID$(s$,i,1))
        IF stkPtr=0 THEN
            push(x)
        ELSEIF x<stack(stkPtr) THEN
            PRINT CHR$(x);
        ELSE
            push(x)
        END IF
    NEXT i
    WHILE stkPtr>0
        PRINT CHR$(pop);
    WEND
END

SUB push(x)
    IF stkPtr<DEPTH THEN
        stkPtr=stkPtr+1: stack(stkPtr)=x
    ELSE
        PRINT: PRINT "Stack overflow!": STOP
    END IF
END SUB

FUNCTION pop
    pop=stack(stkPtr): stkPtr=stkPtr-1
END FUNCTION


Pascalプログラム(2)


PROGRAM test2;
CONST depth=80;
VAR stkPtr : integer;
    stack  : ARRAY[1..depth] OF char;
    x : char;

PROCEDURE push(x:char);
BEGIN
    IF stkPtr<depth THEN
        BEGIN 
            stkPtr:=stkPtr+1; 
            stack[stkPtr]:=x 
        END
    ELSE 
        BEGIN 
            writeln; writeln('Stack overflow!'); 
            halt 
        END
END;

FUNCTION pop: char;
BEGIN 
    pop:=stack[stkPtr]; 
    stkPtr:=stkPtr-1 
END;

 BEGIN
    stkPtr:=0;
    WHILE NOT eoln DO
    BEGIN
        read(x);
        IF stkPtr=0 THEN push(x)
                    ELSE IF x<stack[stkPtr] THEN write(x)
                                            ELSE push(x)
    END;
    WHILE stkPtr>0 DO write(pop)
END.


JOI'94へ戻る

JOIホームページへ戻る