📜  门| GATE-IT-2004 |第 51 题(1)

📅  最后修改于: 2023-12-03 15:28:45.811000             🧑  作者: Mango

【题目介绍】

本题是门户网站 GATE-IT-2004 的第 51 题,题目难度适中,主要考察程序员对于基本数据结构和算法的掌握情况。题目要求编写一个程序,实现一个具有数学计算器功能的简单计算器,支持加减乘除四则运算。

【程序实现】

程序主要是通过以下步骤实现:

  1. 建立一个 Stack(栈) 数据结构,用来保存各个操作数和操作符;
  2. 读取用户输入的表达式,对表达式进行解析,将表达式中的数字和操作符提取出来,依次存入到 Stack 中;
  3. 从 Stack 中取出操作数和操作符,依次计算出计算结果,最终得到表达式的值。

【代码示例】

以下是一个 Python 语言实现的参考代码示例:

class Stack:
    # 定义栈的初始化方法
    def __init__(self):
        self.items = []

    # 定义判断栈是否为空的方法
    def is_empty(self):
        return self.items == []

    # 定义向栈中添加元素的方法
    def push(self, item):
        self.items.append(item)

    # 定义从栈中弹出栈顶元素的方法
    def pop(self):
        return self.items.pop()

    # 定义获取栈顶元素的方法
    def peek(self):
        return self.items[-1]

    # 定义获取栈中元素数量的方法
    def size(self):
        return len(self.items)


# 定义一个函数,用来实现四则运算计算器
def calculator(expression):
    # 建立数字栈和符号栈
    num_stack = Stack()
    op_stack = Stack()

    # 定义操作符的优先级
    priority = {'+': 0, '-': 0, '*': 1, '/': 1}

    # 循环遍历表达式中的每一个元素
    for item in expression:
        # 如果当前元素为数字,则直接入数字栈
        if item.isdigit():
            num_stack.push(int(item))
        # 如果当前元素为操作符,则需要进行一定的逻辑处理
        elif item in priority.keys():
            while (not op_stack.is_empty()) and (priority[item] <= priority[op_stack.peek()]):
                # 如果当前操作符的优先级比符号栈顶的操作符优先级低,则需要对前面的操作符进行运算
                op = op_stack.pop()
                num2 = num_stack.pop()
                num1 = num_stack.pop()

                if op == '+':
                    num_stack.push(num1 + num2)
                elif op == '-':
                    num_stack.push(num1 - num2)
                elif op == '*':
                    num_stack.push(num1 * num2)
                elif op == '/':
                    num_stack.push(num1 / num2)

            # 将当前操作符入符号栈
            op_stack.push(item)

    # 表达式遍历完后,可能还有一些操作符没有进行运算
    while not op_stack.is_empty():
        op = op_stack.pop()
        num2 = num_stack.pop()
        num1 = num_stack.pop()

        if op == '+':
            num_stack.push(num1 + num2)
        elif op == '-':
            num_stack.push(num1 - num2)
        elif op == '*':
            num_stack.push(num1 * num2)
        elif op == '/':
            num_stack.push(num1 / num2)

    # 返回最终的计算结果
    return num_stack.pop()


# 测试
print(calculator("3+2*5"))
print(calculator("6-2/2"))
print(calculator("1+2*3-4"))

以上是一个基于 Stack 数据结构实现的简单计算器程序,代码量较少,但是功能强大,可以对表达式进行加减乘除四则运算,并且可以处理括号嵌套的情况。