表达式求值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -1


char *op = "+-*/()#";
char opt[8][8] = {
    ">><<<>>",
    ">><<<>>",
    ">>>><>>",
    ">>>><>>",
    "<<<<<=@",
    ">>>>@>>",
    "<<<<<@="
};


typedef struct {
    int *base;
    int *top;
    int stacksize;
}SqStack;


int InitStack(SqStack &s) {
    s.base = (int *)malloc(30 * sizeof(int));
    if (!s.base)    exit(OVERFLOW);
    s.top = s.base;
    s.stacksize = 30;
    return OK;
}


int  GetTop(SqStack &s) {
    int e;
    if (s.top == s.base)    return ERROR;
    e = *(s.top - 1);
    return e;
}

int Push(SqStack &s, int e) {
    if (s.top - s.base >= s.stacksize) {
        s.base = (int *)realloc(s.base, (s.stacksize + 10) * sizeof(int));
        if (!s.base)    exit(OVERFLOW);
        s.top = s.base + s.stacksize;
        s.stacksize += 10;
    }

    *s.top++ = e;

    return OK;
}

int Pop(SqStack &s, int &e) {
    if (s.top == s.base)        return ERROR;
    e = *--s.top;

    return OK;
}


int  In(int  c)
{

    if (c >= 48 && c <= 57)
        return 1;
    else return 0;
}



char  Precede(char t1, char  t2) {
    char  *p1, *p2;
    p1 = strchr(op, t1);
    p2 = strchr(op, t2);
    return (opt[p1 - op][p2 - op]);
}


int Operate(int a, char theta, int b)
{


    if (theta == '+')        return (a + b);
    else if (theta == '-')  return (a - b);
    else if (theta == '/')  return (a / b);
    else if (theta == '*')  return (a * b);
    else return ERROR;

}
int  EvaluateExpression() {
    SqStack OPTR, OPND;
    InitStack(OPTR);
    InitStack(OPND);
    Push(OPTR, '#');
    int theta;
    int x, a, b;
    char c = getchar();
    while (c != '#' || GetTop(OPTR) != '#') {                   //OPTR 运算符的栈
        if (In(c)) {                                        //OPND 数字的栈
            Push(OPND, c - 48);

            c = getchar();                              //是数字就进栈
        }
        else {
            switch (Precede(GetTop(OPTR), c)) {
            case'<':
                Push(OPTR, c);

                c = getchar();
                break;
            case'=':
                Pop(OPTR, x);
                c = getchar();
                break;
            case'>':
                Pop(OPTR, theta);
                Pop(OPND, b); Pop(OPND, a);
                Push(OPND, Operate(a, theta, b));
                break;
            }
        }
    }


    return GetTop(OPND);
}


int main(void)
{

    int answer;
    printf("输入表达式\n");
    answer = EvaluateExpression();
    printf("结果 :%d\n", answer);
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值