使用c++设计一个计算器

使用c++设计一个简单的计算器,它支持不带括号的四则运算,计算器要满足先乘除后加减的规则

复制代码
#include <iostream>
#include <string>
#include <vector>
#include <sstream>

// 定义运算符的优先级
int precedence(char op) {
    if (op == '*' || op == '/')
        return 2;
    if (op == '+' || op == '-')
        return 1;
    return 0;
}

// 执行基本的算术运算
double applyOp(double a, double b, char op) {
    switch(op) {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/': return a / b;
    }
    return 0;
}

// 主要的计算函数
double calculate(std::string expression) {
    std::vector<double> values;
    std::vector<char> ops;

    std::stringstream ss(expression);
    std::string token;

    while (ss >> token) {
        if (token == "+" || token == "-" || token == "*" || token == "/") {
            // 处理运算符
            while (!ops.empty() && precedence(ops.back()) >= precedence(token[0])) {
                double b = values.back(); values.pop_back();
                double a = values.back(); values.pop_back();
                char op = ops.back(); ops.pop_back();
                values.push_back(applyOp(a, b, op));
            }
            ops.push_back(token[0]);
        } else {
            // 处理数字
            values.push_back(std::stod(token));
        }
    }

    // 处理剩余的运算
    while (!ops.empty()) {
        double b = values.back(); values.pop_back();
        double a = values.back(); values.pop_back();
        char op = ops.back(); ops.pop_back();
        values.push_back(applyOp(a, b, op));
    }

    return values.back();
}

int main() {
    std::string expression;
    std::cout << "请输入一个算术表达式(数字和运算符之间用空格分隔):" << std::endl;
    std::getline(std::cin, expression);

    double result = calculate(expression);
    std::cout << "计算结果:" << result << std::endl;

    return 0;
}

这个程序的工作原理如下:

  1. precedence 函数定义了运算符的优先级,乘除的优先级高于加减。
  2. applyOp 函数执行基本的算术运算。
  3. calculate 函数是主要的计算函数:
    • 它使用两个向量:一个存储数值,另一个存储运算符。
    • 它遍历输入的表达式,对于每个标记(数字或运算符):
      • 如果是运算符,它会检查优先级。如果栈顶的运算符优先级更高或相等,就先计算栈顶的运算。
      • 如果是数字,直接压入数值栈。
    • 最后,它处理剩余的运算。
  4. main 函数中,我们从用户那里获取输入的表达式,然后调用 calculate 函数进行计算。

这个计算器能够正确处理不带括号的四则运算,并且遵循先乘除后加减的规则。例如:

相关推荐
大佬,救命!!!10 分钟前
算法实现迭代2_堆排序
数据结构·python·算法·学习笔记·堆排序
Dream it possible!16 分钟前
LeetCode 面试经典 150_栈_简化路径(53_71_C++_中等)(栈+stringstream)
c++·leetcode·面试·
爱和冰阔落21 分钟前
【C++继承下】继承与友元 / static 菱形继承与虚继承 组合的详解分析
c++·面试·腾讯云ai代码助手
天桥下的卖艺者27 分钟前
R语言手搓一个计算生存分析C指数(C-index)的函数算法
c语言·算法·r语言
Espresso Macchiato1 小时前
Leetcode 3715. Sum of Perfect Square Ancestors
算法·leetcode·职场和发展·leetcode hard·树的遍历·leetcode 3715·leetcode周赛471
草莓熊Lotso1 小时前
《C++ Stack 与 Queue 完全使用指南:基础操作 + 经典场景 + 实战习题》
开发语言·c++·算法
敲上瘾1 小时前
单序列和双序列问题——动态规划
c++·算法·动态规划
ajassi20001 小时前
开源 C++ QT QML 开发(二十二)多媒体--ffmpeg编码和录像
c++·qt·开源
太过平凡的小蚂蚁1 小时前
策略模式:让算法选择像点菜一样简单
算法·策略模式
时间醉酒1 小时前
数据结构基石:单链表的全面实现、操作详解与顺序表对比
数据结构·链表