问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c++算术表达式求值

发布网友 发布时间:2023-09-03 09:12

我来回答

1个回答

热心网友 时间:2023-09-15 15:41

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#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("栈已满,无法入栈\n");   \
        exit(-1);   \
    }   \
}
 
//出栈
#define PopStack(stack, value)    \
{   \
    if (!EmptyStack(stack)){   \
        *value = stack->data[stack->top];   \
        stack->top--;    \
    }   \
    else{   \
        printf("栈已空,无法出栈\n");   \
        exit(-1);   \
    }   \
}
 
//取栈顶元素
#define GetStackTop(stack, value) \
{   \
    if (!EmptyStack(stack)){   \
        *value = stack->data[stack->top];   \
    }   \
    else{   \
        printf("栈为空,无法取栈顶元素\n");    \
    }   \
}
 
//优先级表
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("输入有误!\n");  exit(-1);
            }
            return '>';
            break;
        case ')':
            if (top == '(')
                return '=';
            else if(top == '#'){
                printf("输入有误!\n");
                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("表达式输入有误!\n");
                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 == '\n'){
            ch = '#';
        }
        else{
            printf("输入的表达式有误!\n");
            exit(-1);
        }
        GetStackTop(sign, &topSign);
    }
    PopStack(number, &result); //将结果从栈中取出来
    if (!EmptyStack(number)){   //如果取出后栈不为空则表示输入的表达式不正确
        printf("表达式有误!\n");
        exit(-1);
    }
     
    return result;
}
 
int main(void)
{
    printf("%lf\n", CalculateExp());
     
    return 0;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么我在电脑上面下的电影在手机上面不显示? 为什么视频在手机里放不出来在电脑里放得出来? 求问bb霜什么牌‍子‍好 BB霜哪个牌子的比较好啊? 我用很多BB霜都过敏脱皮,该用哪个牌子的才能不过敏?拜托了各位 谢谢... 没有去继续教育会计证会不会被吊销? 会计证连续几年未继续教育会被吊销 我想请问,能不能从视频里抓出一段声音,然后保存,变成手机铃声的那种格式... 高中地理知识如何描述地貌特征 中国地理第一讲:自然地理之河流 ps如何去掉黑色? 怎么用ps擦除人物照片的背景色? 晒干大枣的技巧 word怎么做全页横线? 服用国家管制的精神药品可以短途驾驶机动车。 面包烤箱烤多长时间 创新创业大赛取消报名之后还能再报名吗 怎么在药品里提炼需要的物质 乐高幻影忍者劳埃德的头发用橡皮泥怎么捏 连续闯红灯两次,驾照会被吊销吗??? 备孕,怎么服用维生素E 药店来老外买药用英语该怎么问? 跪求一篇英语作文!! 高中化学,物质提纯,需要那些步骤和对应的器材,请说一下,谢谢 良品铺子商品说明XSDD是什么意思 烤薯条要这样做 国旗下的讲话中历史上的本周大事怎么组织好呢? ...也出现在四川的2012基本药物增补目录,这是为什么呢 岳西翠兰什么档次 医保985政策是什么 C语言中程序是怎么执行的?不是执行主函数里的吗?如果主函数不调用子函数... “申字藏了什么汉字?” 申里面包含了哪些汉字? 申字里包涵了多少个汉字? 时间长了,QQ空间挂件如何移除? QQ空间挂件 怎样才能清除掉? ...写的XX 一个写的DB1X 有知道这两种药片是代表什么的吗? 住建部人均住房面积 住建部:住宅投资下降主要是疫情影响 供应链公司是什么行业 支付宝优享租好过吗 公的泰迪比母的泰迪好在哪里啊? 泰迪狗狗简介 被盗,好友全部拉黑了如何给他辅助验证? 不能帮别人辅助验证怎样可以解决? 塔罗:三天内两次问同一个问题。答案不一样。第一次问了两次,分别是“星... 什么时候贵州贵阳还有漫展? 12月份贵阳哪里有漫展 贵阳漫展 贵阳CH08漫展是什么时间?有哪些活动?怎么买票呢?找不到活动... 树立正确的消费观教学内容