KY129 简单计算器----编译原理思路

简单计算器

https://www.nowcoder.com/practice/5759c29a28cb4361bc3605979d5a6130?tpId=63&tqId=29576&tPage=1&rp=1&ru=/ta/zju-kaoyan

KY129 简单计算器

描述
读入一个只包含 +, -, , / 的非负整数计算表达式,计算该表达式的值。
*
输入描述:**
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出描述:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
示例1
输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
输出:
3.00
13.36

思路:采用编译原理算符优先文法的思路

#include<bits/stdc++.h>
using namespace std;

const int maxStr = 202;
char str[maxStr];
stack<int> opStack;
stack<double> numStack;
int opg[][5] = {
    0, -1, -1, -1,  -1,
    1,  1,  1,  -1, -1,
    1,  1,  1,  -1, -1,
    1,  1,  1,  1,  1,
    1,  1,  1,  1,  1,
};
/*
    #   +   -   *   /
#   0,  -1, -1, -1, -1,
+   1,  1,  1,  -1, -1,
-   1,  1,  1,  -1, -1,
*   1,  1,  1,  1,  1,
/   1,  1,  1,  1,  1,
*/

//词法分析
void getSym(bool& isOp, int& wordValue, int &i) {
    char ch = str[i++];
    while (ch == ' ') {
        ch = str[i++];
    }
    if (isdigit(ch)) {
        int numValue = 0;
        numValue = ch - '0';
        ch = str[i++];
        while (isdigit(ch)) {
            numValue = numValue * 10 + (ch - '0');
            ch = str[i++];
        }
        i--;
        isOp = false;
        wordValue = numValue;
        return;
    }
    else if (ch == '+') {
        isOp = true;
        wordValue = 1;
        return;
    }
    else if (ch == '-') {
        isOp = true;
        wordValue = 2;
        return;
    }
    else if (ch == '*') {
        isOp = true;
        wordValue = 3;
        return;
    }
    else if (ch == '/') {
        isOp = true;
        wordValue = 4;
        return;
    }    
    else if (ch == '#') {
        isOp = true;
        wordValue = 0;
        return;
    }
}

int main() {
    int i;
    bool isOp;
    int wordValue;
    while (cin.getline(str, maxStr) && !(str[0] == '0' && strlen(str) == 1)) {
        str[strlen(str)] = '#';
        i = 0;
        while (!opStack.empty()) opStack.pop();
        while (!numStack.empty()) numStack.pop();
        //压入一个#(0)
        opStack.push(0);
        do {
            getSym(isOp, wordValue, i);
            if (isOp == false) {
                numStack.push(wordValue);
            }
            else {
                if (opg[opStack.top()][wordValue] == -1) {//小于则入栈
                    opStack.push(wordValue);
                }
                else if (opg[opStack.top()][wordValue] == 0) {
                    break;
                }
                else if (opg[opStack.top()][wordValue] == 1) {//大于的规约(计算)
                    double num2 = numStack.top();
                    numStack.pop();
                    double num1 = numStack.top();
                    numStack.pop();
                    int op = opStack.top();
                    opStack.pop();
                    i--;
                    double ans;
                    switch (op) {
                    case 1:
                        ans = num1 + num2;
                        numStack.push(ans);
                        break;
                    case 2:
                        ans = num1 - num2;
                        numStack.push(ans);
                        break;
                    case 3:
                        ans = num1 * num2;
                        numStack.push(ans);
                        break;
                    case 4:
                        ans = num1 / num2;
                        numStack.push(ans);
                        break;
                    default:
                        break;
                    };
                }
            }
        } while (i < strlen(str));
        printf("%.2f\n", numStack.top());
    }
    return 0;
}
全部评论

相关推荐

一只代码牛:应该不是你的问题,我感觉应该是最近不缺人
我的求职进度条
点赞 评论 收藏
分享
xdm&nbsp;早上喝奶茶差点喷出来。事情是这样的,我们班有个哥们儿,简称&nbsp;L,去年秋招拿了字节sp,专业方向是后端。我们当时都震惊:这哥们儿平时课上从来不发言,期末小组作业基本是划水的那种,刷题平台&nbsp;commit记录我点进去看过,绿格子稀稀拉拉。但他面试一路绿灯。一面二面三面&nbsp;hr&nbsp;面,全过,给的还是sp。当时班级群里恭喜他的、问他经验的、约饭的,热闹了一周。他说自己"运气好,准备充分"。我们都信了,直到三月初他入职。入职第二周开始,班里另一个进字节的同学W(在隔壁组的)开始跟我他的不对劲。一开始是写代码慢,后来写不出来,再后来是组里&nbsp;mentor&nbsp;让他fix&nbsp;一个简单&nbsp;bug&nbsp;都搞了一下午没动静。最离谱的是上周。W&nbsp;说他们大部门搞了个新人分享会,让新人讲一下自己负责模块的设计思路。L&nbsp;上去讲了&nbsp;20分钟,全程念稿子,问答环节别人随便问一个"那你这里为什么用&nbsp;Redis&nbsp;不用&nbsp;Memcached",他直接卡&nbsp;30秒说"这个我回去再确认一下"。会后他&nbsp;mentor&nbsp;直接找&nbsp;leader&nbsp;谈,leader&nbsp;找&nbsp;hr&nbsp;谈,hr调出了他面试录像,全程对比口型和回答节奏,发现他二三面有大量时长在偷偷看屏幕外(推测开了双机位&nbsp;AI&nbsp;答题)。(这段是&nbsp;W后来转述给我的,他自己也是听他组里同事八卦来的)昨天下班前,W&nbsp;告诉我L&nbsp;被辞退了,让他自己走,不走就走仲裁但会发函到学校。L&nbsp;现在已经回学校了,朋友圈仅三天可见。我说真的,我不是个心眼小的人,但是我看到这个消息的时候真的有种"嗯,挺好"的感觉。去年秋招我投字节后端,简历挂。我准备了八个月,背&nbsp;八股&nbsp;+&nbsp;刷&nbsp;500&nbsp;题&nbsp;+项目改了三版,连面试机会都没拿到。班里这哥们儿凭着一个外挂上岸,最后还是被甩出来了。不是说作弊就一定会被发现,但是当面试拿到的&nbsp;offer远远超出真实能力的时候,迟早会有这一天。试用期三个月不是给你过家家的,是真的要写代码、要在会议上回答问题、要扛需求的。我现在反而有点同情他。同情他相信"上岸就是终点"。发出来不是为了嘲笑谁,就是想说给那些正在被身边作弊上岸的同学搞得很&nbsp;emo&nbsp;的&nbsp;uu&nbsp;们听——别急,回旋镖很长,但它一定会回来。你继续刷你的题,写你的项目,背你的八股。该是你的迟早是你的,不是你的早晚还得还回去。xdm&nbsp;共勉。
牛客12588360...:我不想评论面试方式,作弊是绝对不对的,但是你八股加刷题也不过是个做题小子,他穿帮纯粹是他菜,你也没有高明到哪里去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务