永发信息网

c++算术表达式求值

答案:1  悬赏:10  手机版
解决时间 2021-11-26 17:24
c++算术表达式求值
最佳答案
#include 
#include 
#include 
 
#define MAXSIZE 100
 
//数字栈
typedef struct oprd{
     
    double data[MAXSIZE];
    int top;
 
}OPRD;
 
//运算符栈
typedef struct optr{
 
    char data[MAXSIZE];
    int top;
 
}OPTR;
 
//因为涉及到两个栈的操作,所以将栈相关的操作用宏定义写成函数,
//这样就具有了通用性
//初始化栈
#define InitStack(StackType, stack)   
{   
    *stack = (StackType *)malloc(sizeof(StackType)); 
    *stack->top = -1;  
}
 
//判栈空
#define EmptyStack(stack)  
(   
    stack->top == -1   
)
 
//判栈满
#define FullStack(stack)   
(   
    stack->top == MAXSIZE - 1    
)
 
//入栈
#define PushStack(stack, value)   
{   
    if (!FullStack(stack)){    
        stack->top++;    
        stack->data[stack->top] = value;    
    }   
    else{   
        printf("栈已满,无法入栈
");   
        exit(-1);   
    }   
}
 
//出栈
#define PopStack(stack, value)    
{   
    if (!EmptyStack(stack)){   
        *value = stack->data[stack->top];   
        stack->top--;    
    }   
    else{   
        printf("栈已空,无法出栈
");   
        exit(-1);   
    }   
}
 
//取栈顶元素
#define GetStackTop(stack, value) 
{   
    if (!EmptyStack(stack)){   
        *value = stack->data[stack->top];   
    }   
    else{   
        printf("栈为空,无法取栈顶元素
");    
    }   
}
 
//优先级表
char compare(char ch, char top)
{
    switch(ch){
        case '+':
        case '-':
            if (top == '+' || top == '-' || top == '*' || top == '/')
                return '<'; //扫描的小于栈顶
            else
                return '>'; //扫描的大于栈顶
            break;
        case '*':
        case '/':
            if (top == '*' || top == '/')
                return '<';
            else
                return '>';
            break;
        case '(':
            if(top == ')'){
                printf("输入有误!
");  exit(-1);
            }
            return '>';
            break;
        case ')':
            if (top == '(')
                return '=';
            else if(top == '#'){
                printf("输入有误!
");
                exit(-1);
            }
            else{
                return '<';
            }
            break;
        case '#':
            return '<';
    }
}
 
//输入表达式并计算结果
double CalculateExp(void)
{
    double result, tempNum1, tempNum2;
    double data = 0, expn;
    char ch, topSign, point = 'n', num = 'n';
    OPTR *sign;
    OPRD *number;
 
    InitStack(OPTR, &sign);
    InitStack(OPRD, &number);
    PushStack(sign, '#');
    printf("请输入表达式:");
    ch = getchar();
    GetStackTop(sign, &topSign);
 
    while(ch != '#' || topSign != '#'){
        if ('0' <= ch && ch <= '9' || ch == '.'){
            if (ch == '.' && point == 'y'){
                printf("表达式输入有误!
");
                exit(-1);
            }
            else if (ch == '.' && point == 'n'){
                point = 'y';
                expn = 0.1;
            }
            else{
                if (point == 'y'){
                    data = data + expn * (ch - '0');
                    expn *= 0.1;
                }
                else{
                    data = data * 10 + (ch - '0');
                }
                num = 'y';
            }
            ch = getchar();
        }
        else if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' || ch == '#'){
            if (num == 'y'){
                PushStack(number, data);
                num = 'n';    point = 'n';
                data = 0;
            }
            GetStackTop(sign, &topSign);
            switch(compare(ch, topSign)){
                case '<':       //扫描运算符优先级小于栈顶元素
                    PopStack(sign, &topSign);
                    PopStack(number, &tempNum1);
                    PopStack(number, &tempNum2);
                    switch(topSign){
                        case '+':  result = tempNum1 + tempNum2;   break;
                        case '-':  result = tempNum1 - tempNum2;   break;
                        case '*':  result = tempNum1 * tempNum2;   break;
                        case '/':  result = tempNum2 / tempNum1;   break;
                    }
                    PushStack(number, result);
                    break;
                case '>':       //扫描运算符优先级大于栈顶元素
                    PushStack(sign, ch);
                    ch = getchar();
                    break;
                case '=':      //扫描运算符为右括号,匹配到了左括号
                    PopStack(sign, &topSign);
                    ch = getchar();
                    break;
            }
        }
        else if (ch == '
'){
            ch = '#';
        }
        else{
            printf("输入的表达式有误!
");
            exit(-1);
        }
        GetStackTop(sign, &topSign);
    }
    PopStack(number, &result); //将结果从栈中取出来
    if (!EmptyStack(number)){   //如果取出后栈不为空则表示输入的表达式不正确
        printf("表达式有误!
");
        exit(-1);
    }
     
    return result;
}
 
int main(void)
{
    printf("%lf
", CalculateExp());
     
    return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
现在4k的数字电视3.5米视距配55寸电视合适么
青春好舞蹈学校地址有知道的么?有点事想过去
从水口车站去大江镇车站有公交车去吗
怎么样收藏今日头条里的文章内容
求好心人发robf4.1汉化版和ROBFS4U汉化版百度
卷发棒 tescom 松下 salonia 博朗 这四个牌子
有8个女同学站成一排排队,每2名女同学隔插3
骑电动车被交警捉到了,我没有证。但是为什么
99X97/98 怎么简便算?
我想在coreldraw里修改这个在网上下载的模板
大家帮忙想想办法,家里有几万斤的橙子无人收
海螺村地址好找么,我有些事要过去,
在家用家俱可以自己做充气娃娃吗
黑色毛衣配高腰皮裙好看吗
身高170体重50公斤健身计划,希望尽量讲的详
推荐资讯
衬氟化工泵厂家哪个最大?公司生产需要设备。
马上首保,请教换全合成机油需要补多少差价
涵玉的成语
帮忙列举城市里没有而农村有的所有东西,
一个见字一颗红心打一成语
Giant(捷安特)修武专卖店地址有知道的么?有
apid登陆不了QQ游戏大厅?
利用Γ函数求∫e^-2x2dx
有没有人可以推荐几家比较好的TPU原材的厂家
郎咸平被打死了吗?
这种交通事故,责任怎么划分???
时尚买手课程学习之后的前途怎样
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?