【每日编程-344期】2019年天津大学计算机上机(三)

教育   2024-11-03 10:02   广西  

2019年天津大学计算机上机(三)


每日编程中遇到任何疑问、意见、建议请公众号留言或直接撩Q474356284(备注每日编程)



输入字符串的中缀表达式

包含‘+’、‘-’、‘*’、‘/’、‘(’、‘)’,输出运算结果。

输入格式:

字符串的中缀表达式

输出格式:

计算结果

输入样例:

3+5-3)*2

输出样例:

7

解决方法:

(1)算法的基本思想:

将前两期内容整合。

(2)代码实现:

class Solution
{
public:
    int calculate(string s)
    {
        int n = s.size(), num = 0, curRes = 0, res = 0;
        char op = '+';
        for (int i = 0; i < n; ++i)
        {
            char c = s[i];
            if (isdigit(c))
            {
                num = num * 10 + c - '0';
            }
            else if (c == '(')
            {
                int j = i, cnt = 0;
                for (; i < n; ++i)
                {
                    if (s[i] == '(')
                        ++cnt;
                    if (s[i] == ')')
                        --cnt;
                    if (cnt == 0)
                        break;
                }
                //计算括号中间的算术表达式
                num = calculate(s.substr(j + 1, i - j - 1));
            }
            if (c == '+' || c == '-' || c == '*' || c == '/' || i == n - 1)
            {
                //op是前面一个数的符号,c是后面的符号
                switch (op)
                {
                case '+':
                    curRes += num;
                    break;
                case '-':
                    curRes -= num;
                    break;
                case '*':
                    curRes *= num;
                    break;
                case '/':
                    curRes /= num;
                    break;
                }
                //如果后面的符号是‘+’‘-’,则直接进行计算。
                //举栗子:1+2…… -> +1+2…… 确定op='+'和c='+'则将1加到res中
                //如果 1*2…… -> +1*2…… 确定op='+'而c='*',不符合条件,因为不确定2后面是什么符号
                if (c == '+' || c == '-' || i == n - 1)
                {
                    res += curRes;
                    curRes = 0;
                }
                op = c;//向后移动
                num = 0;//置0
            }
        }
        return res;
    }
};

明日预告:2019年天津大学计算机上机(四) 
原题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1232

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?

输入格式:

测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。

输出格式:

对每个测试用例,在1行里输出最少还需要建设的道路数目。

输入样例:

4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0

输出样例:

1
0
2
998


灰灰考研
最全的【计算机考研】【软件考研】考研信息! 最丰富的共享资料! 最大程度上帮助学渣狗登上研究生大门!
 最新文章