饭否君FF 2022-02-04 04:52 采纳率: 0%
浏览 30

简单计算器的代码在VS中运行错误

问题遇到的现象和发生背景
#include <iostream>
#include <cstdio>
#include <string>
#include <stack>
#include <map>
#include <queue>
using namespace std;

struct node {
    double num;  //操作数
    char op;     //操作符
    bool flag;   //true表示操作数,false表示操作符
};

string str;
stack<node> s;//操作符栈
queue<node> q;//后缀表达式序列
map<char, int> op;

//将中缀表达式转换为后缀表达式
void Change() {
    double num;
    node temp;
    for (int i = 0;i < str.length();) {
        if (str[i] >= '0' && str[i] <= '9') {//如果是数字
            temp.flag = true;//标记是数字数
            temp.num = str[i++] - '0';//记录这个操作数的第一个位数
            while (i < str.length() && str[i] >= '0' && str[i] <= '9') {
                temp.num = temp.num * 10 + (str[i] - '0');  //更新这个操作数
                i++;
            }
            q.push(temp);//将操作数压入后缀表达式的队列
        }
        else {  //如果是操作符
            temp.flag = false;//标记是操作符
            //只要操作符栈顶元素比该操作符优先级高
            //就把操作符栈栈顶元素弹出到后缀表达式的队列中
            while (!s.empty() && op[str[i]] <= op[s.top().op]) {
                q.push(s.top());
                s.pop();
            }
            temp.op = str[i];
            s.push(temp); //把该操作符压入操作符栈中
            i++;
        }
    }
    while (!s.empty()) {
        q.push(s.top());
        s.pop();
    }
}

double Cal() {
    double temp1, temp2;
    node cur, temp;
    while (!q.empty()) {    //只要后缀表达式非空
        cur=q.front();      //记录队的首元素
        q.pop();
        if (cur.flag == true) s.push(cur); //如果是操作数,直接压入栈
        else {//如果是操作符
            temp2 = s.top().num;//弹出第二操作数
            s.pop();
            temp1 = s.top().num;//弹出第一操作数
            s.pop();
            temp.flag = true;//记录临时操作数
            if (cur.op == '+') temp.num = temp1 + temp2;//加法
            else if (cur.op == '-') temp.num = temp1 - temp2;//减法
            else if (cur.op == '*') temp.num = temp1 * temp2;//乘法
            else temp.num = temp1 / temp2;//除法
            s.push(temp);//把该操作数压入栈
        }
    }
    return s.top().num; //栈顶元素就是后缀表达式的值
}

int main() {
    op['+'] = op['-'] = 1;//设定操作符的优先级
    op['*'] = op['/'] = 2;
    while (getline(cin, str), str != "0") {
        //for (string::iterator it = str.end();it != str.begin();it--) {
            //if (*it == ' ') str.erase(it);//把表达式中的空格全去掉
        //}
        while (!s.empty()) s.pop();//初始化栈
        Change();//将中缀表达式转换为后缀表达式
        printf("%.2f\n", Cal());//计算后缀表达式
    }
    return 0;
}

 //for (string::iterator it = str.end();it != str.begin();it--) {
            //if (*it == ' ') str.erase(it);//把表达式中的空格全去掉
        //}

主函数用把表达式中空格去掉这步出错

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • _GX_ 2022-02-04 06:21
    关注

    调用string::erase(it)会导致迭代器it失效。可以用下面方法删除字符串str中的所有空白符(空格、制表符、换行符),结果存到new_str

    string new_str;
    copy_if(str.begin(), str.end(), back_inserter(new_str), [](auto c) { return !std::isspace(c); });
    
    评论

报告相同问题?

问题事件

  • 创建了问题 2月4日

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题