每日编程中遇到任何疑问、意见、建议请公众号留言或直接撩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;
}
};
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
输入格式:
测试输入包含若干测试用例。每个测试用例的第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