实现中缀整数表达式求值--使用数组实现,在数组头处一个栈,在数组尾部有另一个栈

struct shareIndex

{

    INT top;

    INT flag;

    

};

struct shareArray

{

    CHAR* item;

    struct shareIndex stack1;

    struct shareIndex stack2;

};

void DataStacksShareInital(INT);

void DataStacksSharePush(INT,CHAR);

CHAR DataStacksSharePop(INT);

void DataStacksShareFree();

CHAR DataStacksShareView(INT flag);

typedef struct shareArray* ShareArray;

static ShareArray g_shareArray;

static INT shareTotlal;

void DataStacksShareInital(INT max)

{

    if (max <= 0)

    {

        printf("max <=0");

        return;

    }

    g_shareArray = malloc(sizeof(*g_shareArray));

    if (!g_shareArray)

    {

        printf("g_shareArray is null");

        return;

    }

    g_shareArray->item = malloc(sizeof(CHAR)*max);

    if (!(g_shareArray->item))

    {

        printf("g_shareArray->item is null");

        return;

    }

    memset(g_shareArray->item,0, sizeof(CHAR)*max);

    g_shareArray->stack1.flag = 1;

    g_shareArray->stack1.top = -1;

    g_shareArray->stack2.flag = 2;

    g_shareArray->stack2.top = max;

    shareTotlal = max;

    

}

INT IsFull()

{

    return (g_shareArray->stack1.top+1 == g_shareArray->stack2.top);

}

INT IsEmpty()

{

    return ((g_shareArray->stack1.top == -1)||(g_shareArray->stack2.top == shareTotlal));

}

void DataStacksSharePush(INT flag,CHAR item)

{

    if (IsFull())

    {

        printf("isfull");

        return;

    }

    

    switch (flag)

    {

        case 1:

            g_shareArray->stack1.top +=1;

            g_shareArray->item[g_shareArray->stack1.top] = item;

            break;

        case 2:

            g_shareArray->stack2.top -=1;

            g_shareArray->item[g_shareArray->stack2.top] = item;

            break;

        default:

            break;

    }

}

CHAR DataStacksSharePop(INT flag)

{


    switch (flag)

    {

        case 1:

            if (g_shareArray->stack1.top == -1)

            {

                printf("header IsEmpty\n");

                return '\0';

            }

            return g_shareArray->item[g_shareArray->stack1.top--];

            

        case 2:

            if (g_shareArray->stack2.top == shareTotlal)

            {

                printf("end IsEmpty\n");

                return '\0';

            }

           return g_shareArray->item[g_shareArray->stack2.top++];

            

        default:

            break;

    }

   return '\0';

}

void DataStacksShareFree()

{

    free(g_shareArray->item);

    free(g_shareArray);

}

CHAR DataStacksShareView(INT flag)

{

    

    switch (flag)

    {

        case 1:

            if (g_shareArray->stack1.top == -1)

            {

                printf("DataStacksShareView header IsEmpty\n");

                return '\0';

            }

            return g_shareArray->item[g_shareArray->stack1.top];

            

        case 2:

            if (g_shareArray->stack2.top == shareTotlal)

            {

                printf("DataStacksShareView end IsEmpty\n");

                return '\0';

            }

            return g_shareArray->item[g_shareArray->stack2.top];

            

        default:

            break;

    }

    return '\0';

}





enum GRADE

{

    leftBrackets = -1,

    None,

    AddAndMinus,

    MulitAndDiv,

    

};

typedef enum GRADE Grade;

Grade TestGrade(CHAR operator)

{

    Grade gradeStack = None;

    if (operator == '\0')

    {

        gradeStack = None;

    }

    else if(operator == '+')

    {

        gradeStack = AddAndMinus;

    }

    else if(operator == '*')

    {

        gradeStack = MulitAndDiv;

    }

    return gradeStack;

}

void calStack(Grade gradeStack)

{

    switch (gradeStack)

    {

        case AddAndMinus:

        {

            INT temp3 = DataStacksSharePop(1)-'0';

            INT temp4 = DataStacksSharePop(1)-'0';

            DataStacksSharePush(1,(temp3+temp4)+'0');

            break;

        }

        case MulitAndDiv:

        {

            INT temp3 = DataStacksSharePop(1)-'0';

            INT temp4 = DataStacksSharePop(1)-'0';

            DataStacksSharePush(1,temp3*temp4+'0');

            break;

        }

        default:

            break;

    }

}

void IsGrade(CHAR operator)

{

    Grade gradeStack = TestGrade(operator);

    calStack(gradeStack);

}

void result(Grade grade,Grade gradeStack)

{

    do {

        CHAR operator = DataStacksShareView(2);

        gradeStack = TestGrade(operator);

        if (grade <= gradeStack)

        {

            calStack(gradeStack);

            DataStacksSharePop(2);

        }

    } while ((grade <= gradeStack)&&(gradeStack != None));

}

void secondFix(char* aSource)

{

    if (!aSource)

    {

        return;

    }

    int len = (INT)strlen(aSource);

    CHAR* a = aSource;

    DataStacksShareInital(len);


    for (int i = 0;i <= len;++i)

    {

        if ((a[i] >= '0')&&(a[i] <= '9'))

        {

            DataStacksSharePush(1,a[i]);

        }

        if (a[i] == '(')

        {

            DataStacksSharePush(2,a[i]);

        }

        if (a[i] == ')')

        {

            CHAR operator = DataStacksSharePop(2);

            while (operator != '(')

            {

                IsGrade(operator);

                operator = DataStacksSharePop(2);

            }


        }

        if (a[i] == '*'||a[i] == '+')

        {

            Grade grade = TestGrade(a[i]);

            Grade gradeStack = None;

            result(grade,gradeStack);

            DataStacksSharePush(2,a[i]);

        }

        if (a[i] == '\0')//结束的标志

        {

            Grade grade = None;

            Grade gradeStack = None;

            result(grade,gradeStack);

        }

    }

    printf("%c",DataStacksSharePop(1));

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值