• 数据结构实验4


    题目:设计两个栈 S1、S2 都采用顺序栈方式,并且共享一个存储区[0,MaxLen-1], 为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式,如图 2-1 所示。设计一个有关栈的入栈和出栈算法。

    test.h

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <malloc.h>   
    typedef struct
    {
        DataType stack[MaxLen];
        int top[2];
    }SequenStack;
    typedef int DataType;
    #define INT1 "左端栈的栈顶元素是:%d,右端栈的栈顶元素是:%d
    "
    #define INT2 "%5d"
    void InitStack(SequenStack *S)
    /*共享栈的初始化*/
    {
        S->top[0]=0;
        S->top[1]=MaxLen-1;
    }
    int GetTop(SequenStack S, DataType *e,int flag)   
    /*取栈顶元素。将栈顶元素值返回给e,并返回1表示成功;否则返回0表示失败。*/
    {
        switch(flag)
        {
        case 1:         /*为1,表示要取左端栈的栈顶元素*/
            if(S.top[0]==0)
                return 0;
            *e=S.stack[S.top[0]-1];
            break;
        case 2:         /*为2,表示要取右端栈的栈顶元素*/
            if(S.top[1]==MaxLen-1)
                return 0;
            *e=S.stack[S.top[1]+1];
            break;
        default:
            return 0;            
        }
        return 1;
    }
    int PushStack(SequenStack *S,DataType e,int flag)
    /*将元素e入共享栈。进栈成功返回1,否则返回0*/
    {
        if(S->top[0]==S->top[1]+1)        /*如果共享栈已满*/
            return 0;                 /*返回0,进栈失败*/
        switch(flag)
        {
        case 1:                /*当flag为1,表示将元素进左端的栈*/
            S->stack[S->top[0]]=e;    /*元素进栈*/
            S->top[0]++;            /*修改栈顶指针*/
            break;
        case 2:            /*当flag为2,表示将元素要进右端的栈*/
            S->stack[S->top[1]]=e;    /*元素进栈*/
            S->top[1]--;            /*修改栈顶指针*/
            break;
        default:
            return 0;
        }
        return 1;                     /*返回1,进栈成功*/
    }
    int PopStack(SequenStack *S,DataType *e,int flag)
    {
        switch(flag)             /*在出栈操作之前,判断哪个栈要进行出栈操作*/
        {
        case 1:             /*为1,表示左端的栈需要出栈操作*/
            if(S->top[0]==0)    /*左端的栈为空*/
                return 0;     /*返回0,出栈操作失败*/
            S->top[0]--;        /*修改栈顶指针,元素出栈操作*/
            *e=S->stack[S->top[0]];    /*将出栈的元素赋给e*/
            break;
        case 2:             /*为2,表示右端的栈需要出栈操作*/
            if(S->top[1]==MaxLen-1)    /*右端的栈为空*/
                return 0;             /*返回0,出栈操作失败*/
            S->top[1]++;                /*修改栈顶指针,元素出栈操作*/
            *e=S->stack[S->top[1]];    /*将出栈的元素赋给e*/
            break;
        default:
            return 0;
        }
        return 1; /*返回1,出栈操作成功*/
    }
    int StackEmpty(SequenStack S,int flag)
    /*判断栈是否为空。如果栈为空,返回1;否则,返回0。*/
    {
        switch(flag)
        {
        case 1:         /*为1,表示判断左端的栈是否为空*/
            if(S.top[0]==0)
                return 1;
            break;
        case 2:         /*为2,表示判断右端的栈是否为空*/
            if(S.top[1]==MaxLen-1)
                return 1;
            break;
        default:
            printf("输入的flag参数错误!");
            return -1;            
        }
        return 0;
    }

    test.c

    #include<stdio.h>
    #include<stdlib.h>
    #define MaxLen 15
    typedef int DataType;
    #define INT1 "左端栈的栈顶元素是:%d,右端栈的栈顶元素是:%d
    "
    #define INT2 "%5d"
    #include "test.h"        /*包含共享栈的基本类型定义和基本操作实现*/
    void main()
    {
        SequenStack S;            /*定义一个共享栈*/
        int i;
        DataType a[]={1,2,3,4,5,6,7,8,9,0};
        DataType b[]={10};
        DataType e1,e2;
        InitStack(&S);                    /*初始化共享栈*/
        for(i=0;i<sizeof(a)/sizeof(a[0]);i++)    /*将数组a中元素依次进左端栈*/
        {
            if(PushStack(&S,a[i],1)==0)
            {
                printf("栈已满,不能入栈!");
                return;
            }
        }
        for(i=0;i<sizeof(b)/sizeof(b[0]);i++)    /*将数组b中元素依次进右端栈*/
        {
            if(PushStack(&S,b[i],2)==0)
            {
                printf("栈已满,不能入栈!");
                return;
            }
        }    
        if(GetTop(S,&e1,1)==0)
        {
            printf("栈已空");
            return;
        }
        if(GetTop(S,&e2,2)==0)
        {
            printf("栈已空");
            return;
        }
        printf(INT1,e1,e2);
        printf("左端栈的出栈的元素次序是:");
        
        while(!StackEmpty(S,1))    /*将左端栈元素出栈*/
        {
            PopStack(&S,&e1,1);
            printf(INT2,e1);    
        }
        printf("
    ");
        printf("右端栈的出栈的元素次序是:");
        while(!StackEmpty(S,2))    /*将右端栈元素出栈*/
        {
            PopStack(&S,&e2,2);
            printf(INT2,e2);
        }
        printf("
    ");    
    }
  • 相关阅读:
    luogu P1877 [HAOI2012]音量调节
    luogu P1510 精卫填海
    luogu P1508 Likecloud-吃、吃、吃
    我的VIM
    luogu P1310 表达式的值
    luogu P1402 酒店之王
    luogu P3119 [USACO15JAN]草鉴定Grass Cownoisseur
    luogu P1879 [USACO06NOV]玉米田Corn Fields
    luogu P2746 [USACO5.3]校园网Network of Schools
    [BZOJ4870][六省联考2017]组合数问题(组合数动规)
  • 原文地址:https://www.cnblogs.com/wuyibb/p/6930607.html
Copyright © 2020-2023  润新知