• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
nuoyananman
博客园    首页    新随笔    联系   管理    订阅  订阅

四则运算(含括号)C++

输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。

数据范围:表达式计算结果和过程中满足 |val| \le 1000 \∣val∣≤1000  ,字符串长度满足 1 \le n \le 1000 \1≤n≤1000 

输入描述:

输入一个算术表达式

输出描述:

得到计算结果

示例1

输入:
3+2*{1+2*[-4/(8-6)+7]}
输出:
25
#include<iostream>
#include<vector>
#include<string>
#include<limits.h>
using namespace std;
int zuo=0, you=0;
bool isshu(string s){//判断字符串是否为数字
    if (s[0] <= '9' && s[0] >= '0')return true;
    if (s[0] = '-' && s.size() > 1)return true;
    return false;
}
int jisuan(vector<string> x) {         //计算没有括号的式子;
    vector <int> a; string w = ""; int b,c;
    for (int i = 0; i < x.size(); ++i) {
        if (x[i] == " ")continue;
        if (isshu(x[i]))a.push_back(stoi(x[i]));
        if (x[i] == "*") {
            while (!isshu(x[i])) {
                if (x[i] == "-") {
                    c = a.back(); a.pop_back();
                    a.push_back(INT_MIN);
                    a.push_back(c);
                }
                ++i;
            }
            b = stoi(x[i]);
            c = a.back() * b;
            a.pop_back();
            a.push_back(c);
        }
        if (x[i] == "/") {
            while (!isshu(x[i])) {
                if (x[i] == "-") {
                    c = a.back(); a.pop_back();
                    a.push_back(INT_MIN);
                    a.push_back(c);
                }
                ++i;
            }
            b = stoi(x[i]);
            c = a.back() / b;
            a.pop_back();
            a.push_back(c);
        }
        if (x[i] == "-")a.push_back(INT_MIN);
    }
    b = 0;
    for (int i = 0; i < a.size(); ++i) {
        if (a[i] == INT_MIN) {
            a[i] = 0;
            ++i;
            a[i] = -a[i];
        }
    }
    for (int i = 0; i < a.size(); ++i) {
        b += a[i];
    }
    return b;
}
bool kh(vector<string> x) {         //判断是否有括号,如果有,记录第一个完整括号的左右括号位置;
    for (int i = 0; i < x.size(); ++i) {
        if (x[i] == "{" || x[i] == "(" || x[i] == "[")zuo = i;
        else  if (x[i] == "}" || x[i] == ")" || x[i] == "]") {
            you = i;
            return true;
        }
    }
    return false;
}
int youkuohao(vector<string> x) {
    vector<string>b; int aw;
    while (kh(x)) {//如果有括号,计算括号内式子,并将值代替原括号;
        b.assign(x.begin() + zuo+1, x.begin() + you);
        aw = jisuan(b);
        x[zuo] = to_string(aw);
        for (int i = zuo + 1; i <= you;++i)x[i] = " ";
    }
    aw = jisuan(x);
    return aw;
}
int main() 
{
    string s,w="",c="";  vector<string>ss;//ss把s里在一起的数字当做一个整数
        cin >> s;
        for (int i = 0; i < s.size(); ++i) {
            if (s[i] <= '9' && s[i] >= '0') {
                w += s[i];
            }
            else
            {
                if(w!="")ss.push_back(w);
                w = ""; c += s[i];
                ss.push_back(c);
                c = "";
            }
        }
        ss.push_back(w);
        int a = youkuohao(ss);
        cout << a << endl;
    return 0;
}

 

 
posted @ 2022-04-01 15:39  南蛮入侵  阅读(307)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3