扫描字符串和存储数字和操作在不同的向量c++

Scan string and store numbers and operations in different vectors C++

本文关键字:向量 c++ 操作 字符串 存储 数字 扫描      更新时间:2023-10-16

假设我有一个如下格式的字符串exp:

123 + 456 * 789 - 1011 + 1213

我想把所有的数存储在向量数中,把所有的运算存储在向量op中。

vector<long long>numbers // {123, 456, 789, 1011, 1213}
vector<char>op // {+, *, -, +}
for (int i = 0; i <  exp.size(); i++){
    if (exp[i]=="+" || exp[i]=="-" || exp[i]=="*"){
        op.push_back(exp[i]);
    }else{
        ...
    }
}

如何存储数字,并将它们从char转换为long long?

您需要解析输入表达式以提取数字和运算符。
有许多方法可以做到这一点,但以下是我的方法。

  1. 遍历所有字符,将Operator vector中非数字的值压入并替换为空格

  2. 现在从表达式中提取数字并将其转换为数字并将值推入数字向量

要了解如何分割字符串,您可以查看以下链接:

  1. 拆分字符串-堆栈溢出
  2. 拆分字符串- cplusplus.com

使用stol或strtol或字符串流将string值转换为long值。


#include <iostream>
#include <string>
#include <vector>
#include <sstream>
int main()
{
    std::string exp = "123+456*789-1011+1213";
    std::vector<long> vecNums;
    std::vector<char> vecOper;
    for (decltype(exp.size()) i = 0; i < exp.size(); ++i) {
        if (!isdigit(exp[i])) {
            vecOper.push_back(exp[i]);
            exp[i] = ' ';
        }
    }
    std::istringstream iss(exp);
    while (iss) {
        std::string substr;
        long num;
        std::getline(iss, substr, ' ');
        if (substr.size() != 0) {
            // Using strtol function
            // num = strtol(substr.c_str(), NULL, 10);
            // Using stol function
            num = stol(substr);
            vecNums.push_back(num);
        }
        //
        // Or use string stream to convert string to long
        //
        //long num;
        //iss >> num;
        //vecNums.push_back(num);
    }
    std::cout << "Numbers: " << std::endl;
    for (auto &i : vecNums) {
        std::cout << i << " ";
    }
    std::cout << "nOperators: " << std::endl;
    for (auto &i : vecOper)
        std::cout << i << " ";
    return 0;
}

如果你打算使用iostreams:

void parse_string(const string& s) {
    using num_t = long long;
    using op_t = char;
    istringstream sstr(s);
    vector<num_t> numbers;
    vector<op_t> ops;
    (void)sstr.peek();  //set eofbit if s.empty() 
    while (!sstr.eof() && !sstr.fail()) {
        num_t num;
        sstr >> num;
        if (!sstr.fail()) {
            numbers.push_back(num);
            if (!sstr.eof()) {
                op_t op;
                sstr >> op;
                if (!sstr.fail()) {
                    ops.push_back(op);
                }
            }
        }
    }
    //assert(ops.size() + 1 == numbers.size());
    //copy(begin(numbers), end(numbers), ostream_iterator<num_t>(cout, " "));
    //copy(begin(ops), end(ops), ostream_iterator<op_t>(cout, " "));
}

已删除错误检查代码(验证操作符是否正确,异常)。