题解 | #四则运算#

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

#include<stdio.h>
#include<string.h>
int compute(int num1, int num2, char symbol)//主运算函数
{
    int ans;
    switch (symbol)
    {
    case '+':
        ans = num1 + num2;
        break;
    case '-':
        ans = num1 - num2;
        break;
    case '*':
        ans = num1 * num2;
        break;
    case '/':
        ans = num1 / num2;
        break;
    }
    return ans;
}

int main(void)
{
    char str[1000] = { 0 };
    char symbol_stack[1000] = { 0 };//符号栈
    int number_stack[1000] = { 0 };//数字栈
    int s_size = 0, n_size = 0;
    int i = 0;
    int num1, num2;
    scanf("%[^\n]", &str);
    int len = strlen(str);
    for (i = 0; i < len; i++)//遍历字符串
    {
        if (str[i] == '(' || str[i] == '[' || str[i] == '{')
        {
            symbol_stack[s_size++] = str[i];//左括号直接压入符号栈
        }
        if (str[i] == '-')
        {
            //先判断是符号还是减号
            if (i == 0 || str[i - 1] == '(' || str[i - 1] == '[' || str[i - 1] == '{') // 代表符号
            {
                int temp = 0;
                i++;
                while (str[i] >= '0' && str[i] <= '9')
                {
                    temp = 10 * temp + str[i] - '0';
                    i++;
                }
                number_stack[n_size++] = 0 - temp;
            }
            else//代表减号
            {
                while (s_size > 0 && (symbol_stack[s_size - 1] == '-' || symbol_stack[s_size - 1] == '*' || symbol_stack[s_size - 1] == '/'))
                {
                    num2 = number_stack[--n_size];
                    num1 = number_stack[--n_size];
                    number_stack[n_size++] = compute(num1, num2, symbol_stack[--s_size]);
                }
                symbol_stack[s_size++] = '-';
            }
        }
        if (str[i] == '+')
        {
            //先判断是符号还是加号
            if (i == 0 || str[i - 1] == '(' || str[i - 1] == '[' || str[i - 1] == '{') // 代表符号
            {

            }
            else//代表加号
            {
                while (s_size > 0 && (symbol_stack[s_size - 1] == '-' || symbol_stack[s_size - 1] == '*' || symbol_stack[s_size - 1] == '/'))
                {
                    num2 = number_stack[--n_size];
                    num1 = number_stack[--n_size];
                    number_stack[n_size++] = compute(num1, num2, symbol_stack[--s_size]);
                }
                symbol_stack[s_size++] = '+';
            }
        }
        if (str[i] == '*')
        {
            while (s_size > 0 && (symbol_stack[s_size - 1] == '/'))
            {
                num2 = number_stack[--n_size];
                num1 = number_stack[--n_size];
                number_stack[n_size++] = compute(num1, num2, symbol_stack[--s_size]);
            }
            symbol_stack[s_size++] = '*';
        }
        if (str[i] == '/')
        {
            while (s_size > 0 && (symbol_stack[s_size - 1] == '*' || symbol_stack[s_size - 1] == '/'))
            {
                num2 = number_stack[--n_size];
                num1 = number_stack[--n_size];
                number_stack[n_size++] = compute(num1, num2, symbol_stack[--s_size]);
            }
            symbol_stack[s_size++] = '/';
        }
        if (str[i] >= '0' && str[i] <= '9')
        {
            int temp = 0;
            while (str[i] >= '0' && str[i] <= '9')
            {
                temp = temp * 10 + str[i] - '0';
                i++;
            }
            if (!(str[i] >= '0' && str[i] <= '9'))
            {
                i--;
            }
            number_stack[n_size++] = temp;
        }
        if (str[i] == ')')
        {
            while (symbol_stack[s_size - 1] != '(')
            {
                num2 = number_stack[--n_size];
                num1 = number_stack[--n_size];
                number_stack[n_size++] = compute(num1, num2, symbol_stack[--s_size]);
            }
            s_size--;
        }
        if (str[i] == ']')
        {
            while (symbol_stack[s_size - 1] != '[')
            {
                num2 = number_stack[--n_size];
                num1 = number_stack[--n_size];
                number_stack[n_size++] = compute(num1, num2, symbol_stack[--s_size]);
            }
            s_size--;
        }
        if (str[i] == '}')
        {
            while (symbol_stack[s_size - 1] != '{')
            {
                num2 = number_stack[--n_size];
                num1 = number_stack[--n_size];
                number_stack[n_size++] = compute(num1, num2, symbol_stack[--s_size]);
            }
            s_size--;
        }

    }
    while (s_size > 0)
    {
        num2 = number_stack[--n_size];
        num1 = number_stack[--n_size];
        number_stack[n_size++] = compute(num1, num2, symbol_stack[--s_size]);
    }
    printf("%d", number_stack[--n_size]);
    return 0;
}
全部评论

相关推荐

最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
给🐭🐭个面试机会...:我擦seed✌🏻
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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