1. 程式人生 > >在一個數組中實現兩個堆疊

在一個數組中實現兩個堆疊

函式介面定義:

Stack CreateStack( int MaxSize );
    bool Push( Stack S, ElementType X, int Tag );
    ElementType Pop( Stack S, int Tag );

其中Tag是堆疊編號,取1或2;MaxSize堆疊陣列的規模;Stack結構定義如下:

 typedef int Position;
    struct SNode {
        ElementType *Data;
        Position Top1, Top2;
        int MaxSize;
    };
    typedef struct SNode *Stack;

注意:如果堆疊已滿,Push函式必須輸出“Stack Full”並且返回false;如果某堆疊是空的,則Pop函式必須輸出“Stack Tag Empty”(其中Tag是該堆疊的編號),並且返回ERROR。

裁判程式樣例:



    #include <stdio.h>
    #include <stdlib.h>
     
    #define ERROR 1e8
    typedef int ElementType;
    typedef enum { push, pop, end } Operation;
    typedef enum { false, true } bool;
    typedef int Position;
    struct SNode {
        ElementType *Data;
        Position Top1, Top2;
        int MaxSize;
    };
    typedef struct SNode *Stack;
     
    Stack CreateStack( int MaxSize );
    bool Push( Stack S, ElementType X, int Tag );
    ElementType Pop( Stack S, int Tag );
     
    Operation GetOp();  /* details omitted */
    void PrintStack( Stack S, int Tag ); /* details omitted */
     
    int main()
    {
        int N, Tag, X;
        Stack S;
        int done = 0;
     
        scanf("%d", &N);
        S = CreateStack(N);
        while ( !done ) {
            switch( GetOp() ) {
            case push:
                scanf("%d %d", &Tag, &X);
                if (!Push(S, X, Tag)) printf("Stack %d is Full!\n", Tag);
                break;
            case pop:
                scanf("%d", &Tag);
                X = Pop(S, Tag);
                if ( X==ERROR ) printf("Stack %d is Empty!\n", Tag);
                break;
            case end:
                PrintStack(S, 1);
                PrintStack(S, 2);
                done = 1;
                break;
            }
        }
        return 0;
    }
     
    /* 你的程式碼將被嵌在這裡 */

輸入樣例:



    5
    Push 1 1
    Pop 2
    Push 2 11
    Push 1 2
    Push 2 12
    Pop 1
    Push 2 13
    Push 2 14
    Push 1 3
    Pop 2
    End

輸出樣例:



    Stack 2 Empty
    Stack 2 is Empty!
    Stack Full
    Stack 1 is Full!
    Pop from Stack 1: 1
    Pop from Stack 2: 13 12 11

正確程式碼:(PTA通過)

/*THE ANSWER IS:*/

Stack CreateStack( int MaxSize )
{
	Stack S;
	S=(Stack)malloc(sizeof(struct SNode));
	S->MaxSize=MaxSize;
	S->Top1=-1;
	S->Top2=S->MaxSize;
	S->Data=(ElementType *)malloc(S->MaxSize*sizeof(ElementType));
	return S; 
}
bool Push( Stack S, ElementType X, int Tag )
{
	if(Tag==1)
	{
		if(S->Top1+1==S->Top2)/*如果棧滿*/ 
		{
			printf("Stack Full");
			return false;
		}else{
			S->Data [++(S->Top1)]=X;
			return true;
		} 
	}else if(Tag==2)
	{
		if(S->Top1+1==S->Top2)/*如果棧滿*/ 
		{
			printf("Stack Full");
			return false;
		}else{
			S->Data [--(S->Top2)]=X;
			return true;
		} 
	}
}
ElementType Pop( Stack S, int Tag )
{
	if(Tag==1)
	{
		if(S->Top1==-1)/*棧空*/ 
		{
			printf("Stack %d Empty",Tag);
			return ERROR; 
		}else{
			
			return S->Data[(S->Top1)--];
		}
	}else if(Tag==2)
	{
		if(S->Top2==S->MaxSize)
		{
			printf("Stack %d Empty",Tag);
			return ERROR;
		}else{
			
			return S->Data[(S->Top2)++];
		}
	}
}

SOME TIPS:

①:要注意題目要求,不要急於code。格式上的要求(printf("          \n")),看清輸出語句是讓你寫的還是程式自動執行的,

返回要求,明確要求返回false /ERROR.  (ps:以後不要在這樣的問題山浪費時間!)

②:判斷棧空的條件:棧1空》》S->Tag1==-1;棧2空》》S->Tag2==MaxSize

判斷棧滿的條件:S->Tag1+1==S->Tag2

③:ElementType Pop( Stack S, int Tag )函式返回格式為ElementType,所以請眉毛下邊的兩位認真一些,謝謝!