1. 程式人生 > >另類堆疊 (20 分)

另類堆疊 (20 分)

6-3 另類堆疊 20 分)

在棧的順序儲存實現中,另有一種方法是將Top定義為棧頂的上一個位置。請編寫程式實現這種定義下堆疊的入棧、出棧操作。如何判斷堆疊為空或者滿?

函式介面定義:

bool Push( Stack S, ElementType X );

ElementType Pop( Stack S );

其中Stack結構定義如下:

typedef int Position;

typedef struct SNode *PtrToSNode;

struct SNode {

    ElementType *Data;  /* 儲存元素的陣列 */

    Position Top;       /* 棧頂指標       */

    int MaxSize;        /* 堆疊最大容量   */

};

typedef PtrToSNode Stack;

注意:如果堆疊已滿,Push函式必須輸出“Stack Full”並且返回false;如果佇列是空的,則Pop函式必須輸出“Stack Empty”,並且返回ERROR

裁判測試程式樣例:

#include <stdio.h>

#include <stdlib.h>

 

#define ERROR -1

typedef int ElementType;

typedef enum { push, pop, end } Operation;

typedef enum { false, true } bool;

typedef int Position;

typedef struct SNode *PtrToSNode;

struct SNode {

    ElementType *Data;  /* 儲存元素的陣列 */

    Position Top;       /* 棧頂指標       */

    int MaxSize;        /* 堆疊最大容量   */

};

typedef PtrToSNode Stack;

 

Stack CreateStack( int MaxSize )

{

    Stack S = (Stack)malloc(sizeof(struct SNode));

    S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));

    S->Top = 0;

    S->MaxSize = MaxSize;

    return S;

}

 

bool Push( Stack S, ElementType X );

ElementType Pop( Stack S );

 

Operation GetOp();          /* 裁判實現,細節不表 */

void PrintStack( Stack S ); /* 裁判實現,細節不表 */

 

int main()

{

    ElementType X;

    Stack S;

    int N, done = 0;

 

    scanf("%d", &N);

    S = CreateStack(N);

    while ( !done ) {

        switch( GetOp() ) {

        case push:

            scanf("%d", &X);

            Push(S, X);

            break;

        case pop:

            X = Pop(S);

            if ( X!=ERROR ) printf("%d is out\n", X);

            break;

        case end:

            PrintStack(S);

            done = 1;

            break;

        }

    }

    return 0;

}

 

/* 你的程式碼將被嵌在這裡 */

輸入樣例:

4

Pop

Push 5

Push 4

Push 3

Pop

Pop

Push 2

Push 1

Push 0

Push 10

End

輸出樣例:

Stack Empty

3 is out

4 is out

Stack Full

0 1 2 5

程式碼:

bool Push( Stack S, ElementType X )
{
    if(S->Top==S->MaxSize)
    {
        printf("Stack Full\n");
        return false;
    }
    else
    {
        S->Data[S->Top]=X;
        S->Top=S->Top+1;
        return true;
    }
}
ElementType Pop( Stack S )
{
    if(S->Top==0)
    {
        printf("Stack Empty\n");
        return ERROR;
    }
    else
    {
        S->Top--;
        return S->Data[S->Top];
    }
}