题目

题目描述:

一致火星人使用的运算符为#、$,其与地球人的等价公式如下:

x#y = 4*x+3*y+2
x$y = 2*x+y+3

其中x、y为无符号整数,#的优先级高于$,相同运算符、按从左到右顺序计算。

输入描述:

输入的字符串,仅由无符号整数和操作符(#、$)的计算表达式,不需要考虑非法的表达式输入。

输出描述:

根据输入的火星人字符串输出计算结果(皆为不带回车换行

示例:

输入:

7#6$5#12

输出:

157

解题思路

整体思路:类似冒泡排序,先进后出。

  1. 创建2个数组nums、operators,用于保存数字和运算符
  2. 遍历输入内容:
    • 如果为数字,存入nums;注意这里需要判断连续的数字
    • 如果为#号,存入operators
    • 如果为$号,存入operators
  3. 每次存入数字时,判断operators栈顶的元素是否为#符合:
    • 如果是,对nums栈顶的2个元素数字与#操作符运算;
    • 运算结束后,对数字和操作符出栈,将运算结果存入nums;
    • 遍历完所有输入字符后,同时也说明对所有#操作符均完成运算,即operators数组只剩下$运算符
  4. 每次存入times符号时,记录出现次数的times值,用于最后的操作符循环运算
    • 同样的,对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='')  # 题目要求:输出结果不带回车换行