题目
题目描述:
一致火星人使用的运算符为#、$,其与地球人的等价公式如下:
x#y = 4*x+3*y+2
x$y = 2*x+y+3
其中x、y为无符号整数,#的优先级高于$,相同运算符、按从左到右顺序计算。
输入描述:
输入的字符串,仅由无符号整数和操作符(#、$)的计算表达式,不需要考虑非法的表达式输入。
输出描述:
根据输入的火星人字符串输出计算结果(皆为不带回车换行)
示例:
输入:
7#6$5#12
输出:
157
解题思路
整体思路:类似冒泡排序,先进后出。
- 创建2个数组nums、operators,用于保存数字和运算符
- 遍历输入内容:
- 如果为数字,存入nums;注意这里需要判断连续的数字
- 如果为#号,存入operators
- 如果为$号,存入operators
- 每次存入数字时,判断operators栈顶的元素是否为#符合:
- 如果是,对nums栈顶的2个元素数字与#操作符运算;
- 运算结束后,对数字和操作符出栈,将运算结果存入nums;
- 遍历完所有输入字符后,同时也说明对所有#操作符均完成运算,即operators数组只剩下$运算符
- 每次存入操作符循环运算
- 同样的,对nums栈顶的2个元素数字与$操作符运算;
- 运算结束后,对数字和操作符出栈,对运算结果存入nums;
- 遍历完所有$操作符后,即说明已完成所有的运算,nums仅有1个元素且为最后的值
# #号运算
def fun1(x, y):
return 4 * x + 3 * y + 2
# $号运算
def fun2(x, y):
return 2 * x + y + 3
input1 = input() + '*' # *号为赋值符,仅用于保证可遍历到最后的数字、并不会出现数组越界,实际无作用
operators = []
nums = []
temp = ''
times = 0
for i in range(len(input1)): # 例子:17#6$5#12
if input1[i].isdigit():
temp = temp + input1[i]
else:
if temp != '':
nums.append(int(temp)) # 对连续的数字完成拼接,做为一个整数入栈
temp = ''
# 如果最后个运算符为#,先进行运算;运算完后,将以运算的数字和运算符出栈,并将运算后的结果入栈
if len(operators) >= 1 and operators[-1] == '#':
sum1 = fun1(nums[-2], nums[-1])
nums.pop()
nums.pop()
operators.pop()
nums.append(sum1)
if input1[i] == '#':
operators.append('#')
if input1[i] == '$':
operators.append('$')
times += 1
# 最后对$符进行运算;对运算后的数字和运算符进行出栈,并将运算后的结果入栈。nums数组最后保留的元素即为最终结果
while times > 0:
sum2 = fun2(nums[-2], nums[-1])
nums.pop()
nums.pop()
operators.pop()
nums.append(sum2)
times -= 1
print(nums[0], end='') # 题目要求:输出结果不带回车换行