두 스 택 공유 저장 공간 (한 배열 로 두 스 택 저장)

2892 단어 데이터 구조
사상: 먼저 연속 적 인 저장 공간 (하나의 배열) 을 개척 합 니 다.두 개의 스 택 지붕 은 각각 배열 의 양 끝 을 가리 키 고 push 가 두 스 택 의 스 택 지붕 을 조작 하면 서 배열 안쪽 으로 이동 합 니 다.pop 에서 두 스 택 의 스 택 지붕 을 조작 하면 서 배열 바깥쪽 으로 이동 합 니 다.
#include 
#include 
//        ,       


#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;


//           ;                 
typedef struct{
    ElemType data[MAXSIZE];
    int top1;// 1   
    int top2;// 2   
}DoubleStack;
//1.      
Status InitDS(DoubleStack *DS){
    memset(DS->data,'\0',sizeof(ElemType)*MAXSIZE);/*  memset        ,          ,                   */
    DS->top1=-1;
    DS->top2=MAXSIZE;
    return OK;
}


//2.          push  ,             ,          1   2     
Status DoublePush(DoubleStack *DS,ElemType e,int s_number){
    if(DS->top1+1==DS->top2){
        //        ,      
        return ERROR;
    }
    if(s_number==1){
        //  1    
        ++(DS->top1);
        DS->data[DS->top1]=e;
    }else if(s_number==2){
        --(DS->top2);
        DS->data[DS->top2]=e;
    }
    return OK;
}
//       pop  
Status DoublePop(DoubleStack *DS,ElemType *e,int s_number){
    if(DS->top1==-1 && DS->top2==MAXSIZE){
        printf("     !,        !");
        return ERROR;
    }else if(DS->top1==-1){
        // 1  ,   2    
        if(s_number!=2){
            printf("   1  ,       2!
"); return ERROR; } }else if(DS->top2==MAXSIZE){ if(s_number!=1){ printf(" 2 , 1!
"); return ERROR; } } if(1==s_number){ *e=DS->data[DS->top1]; --DS->top1; }else if(2==s_number){ *e=DS->data[DS->top2]; ++DS->top2; }else{ printf(" , 1 2
"); return ERROR; } return OK; } int main() { DoubleStack DS; if(OK==InitDS(&DS)){ printf(" !"); } int e,s_number; printf("
"); while(2==scanf("%d,%d",&e,&s_number)){ if(OK==DoublePush(&DS,e,s_number)){ int i,j; i=0; j=MAXSIZE-1; printf(" 1 :"); while(i<=DS.top1){ printf("%d\t",DS.data[i++]); } printf("
2 :"); while(j>=DS.top2){ printf("%d\t",DS.data[j--]); } } } printf("
"); while(1==scanf("%d",&s_number)){ printf(" :"); if(OK==DoublePop(&DS,&e,s_number)) printf("%d\t",e); } return 0; }

좋은 웹페이지 즐겨찾기