C++写一个具有加减乘除功能和识别括号的简单计算器

用C++写一个具有加减乘除功能和识别括号的计算器:

先初始化两个char数组,用来保存计算器的数字和运算符。

函数 IsDigit(char c) :用于判断字符是否为数字
函数 IsOperators(char c) : 用于判断字符是否为操作符
函数 DealBrackets(string s) :用于处理掉算式里的所有括号
函数 Formula(string s) :用于处理无括号的算式,返回最终结果

需要注意的是在括号处理的函数中尽量要让函数复杂度为O(n)。

输入是合规范的算式字符串:
如:1/0.5+((2*5.5+1.5)-3.5)

代码如下:

#define _CRT_SECURE_NO_DEPRECATE 
#include<stdio.h>
#include <iostream>
#include<vector>
#include <iomanip>
#include<sstream>

using namespace std;

char digits[11] = { '0','1','2','3','4','5','6','7','8','9','.' };
char operators[4] = { '+','-','*','/' };

float Formula(string s);

bool IsDigit(char c) { //判断字符是否为数字
    for (int i = 0;i < 11;i++) {
        if (c == digits[i])
            return true;
    }
    return false;
}

bool IsOperators(char c) {    //判断字符是否为操作符
    for (int i = 0;i < 4;i++) {
        if (c == operators[i])
            return true;
    }
    return false;
}
float DealBrackets(string s) {   //处理掉算式里的所有括号
    int len = s.size();
    char noBracket[100] = "";
    char inBracket[10][100] = {""};
   
    int numBracket = 0;

    int i = 0;
    while (i < len) {

        if (s[i] == '(') {
            //leftBracket++;
            numBracket++;
        }
        else if (s[i] == ')') {
            // rightBracket--;
            sprintf(inBracket[numBracket - 1] + strlen(inBracket[numBracket - 1]), "%.2f", Formula(inBracket[numBracket]));
            numBracket--;
        }
        else {
            int l = strlen(inBracket[numBracket]);
            inBracket[numBracket][l] = s[i];
        }
        i++;
    }
    return Formula(inBracket[0]);    
}

float Formula(string s) {   //计算最终结果,传入的是不带括号的算式字符串
    int len = s.size();
    string arr = "";
    vector<float> number;
    vector<char> symbol;

    for (int i = 0;i < len;i++) {  //处理过后,只剩加减法
        if (s[i] == ' ') { //过滤空格符

        }
        else if (IsDigit(s[i]) && i != len - 1) {
            arr += s[i];
        }
       
        else { //压入数,并看是否是乘除运算
            if (i == len - 1) {  //到结尾,说明formula[i]是数字
                arr += s[i];
            }
            number.push_back(atof(arr.c_str())); //压入数

            if (!symbol.empty() && (symbol.back() == '*' || symbol.back() == '/')) {
                float a, b;
                a = number.back();
                number.pop_back();
                b = number.back();
                number.pop_back();
                if (symbol.back() == '*') {
                    number.push_back(a * b);
                }
                else if (symbol.back() == '/') {
                    number.push_back(b / a);
                }
                symbol.pop_back();
            }
            

            if (i != len - 1) { //不到结尾,说明formula[i]是字符
                symbol.push_back(s[i]);
            }

            arr = "";
        }
    }
    float sum = number.front();
    while (!symbol.empty()) {
        int a;
        a = number.back();
        if (symbol.back() == '+') {
            sum += a;
        }
        else if (symbol.back() == '-') {
            sum -= a;
        }
        number.pop_back();
        symbol.pop_back();

    }
    return sum;
    
}

int main()
{
    string s = "1/0.5+((2*5.5+1.5)-3.5)";
    cout << setprecision(2) << fixed << DealBrackets(s) << endl;
}

输出结果:
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值