通过String解析双精度c++

Parse through String for doubles C++

本文关键字:双精度 c++ String 通过      更新时间:2023-10-16

我一直在摆弄算法,我读过的一本书提到了Dijkstra的两堆栈算法来计算简单的数学表达式。我读到算法的那本书的例子都是用Java写的,我试图用c++创建我自己的两栈算法(以防有人忘记,快速复习一下)。

双栈算法:

  • Value - Push到值栈
  • 操作符- Push到操作符栈
  • 左括号-忽略
  • 右括号-从值堆栈中取出两个值,从操作符堆栈中取出一个值,并推送结果

假设用户在程序中输入以下字符串:

(1 + (2 + 3) * (4 * 5))

我似乎无法弄清楚是如何让c++解析字符串,同时将"1"读入vals堆栈和"+"读入ops堆栈。我如何遍历一个字符串,并从我的字符串中识别双精度,并将其与用户输入的操作符分开?

如果有人想要示例代码:

public static void main (String[] args)
{
    Stack<String> ops = new Stack<String>();
    Stack<Double> vals = new Stack<Double>();
    while(!StdIn.isEmpty()){
        String s = StdIn.readString();
        if(s.equals("("))           ;
        else if(s.equals("+"))      ops.push(s);
        else if(s.equals("*"))      ops.push(s);
        else if(s.equals(")")){
            String op = ops.pop();
            if(op.equals("+"))      vals.push(vals.pop()+vals.pop());
            else if(op.equals("*")) vals.push(vals.pop()*vals.pop());
        }
        else vals.push(Double.parseDouble(s));
    }
    StdOut.println(vals.pop());
}

任何帮助都是感激的!

这样做的一种方法是使用istringstream。它们有一个有趣的特性,如果读取失败,它将可预见地导致流进入失败状态,然后您可以从中恢复。基本思路如下:

  • 如果你可以,太好了!
  • 如果不是,清除失败并读取下一个令牌。

下面是一个例子:

std::istringstream scanner(/* ... input ... */);
while (true) {
    double number;
    scanner >> number;
    if (scanner.fail() && scanner.eof()) {
        break;
    } else if (!scanner.fail()) {
       /* Read a double */
    } else {
       scanner.clear();
       char token;
       scanner >> token;
       /* This skips whitespace; process your token! */
    }
}

希望这对你有帮助!