通过String解析双精度C ++

时间:2014-05-19 20:57:41

标签: c++ algorithm

我一直在乱用算法和一本书,我读过Dijkstra的双栈算法来评估简单的数学表达式。我读过算法的书都有用Java编写的例子,我试图在C ++中创建自己的两个堆栈算法(如果有人忘记的话,快速复习)。

两个堆栈算法:

  • 值 - 推送到价值堆栈
  • 操作员 - 推入操作员堆栈
  • 左括号 - 忽略
  • 右括号 - 从值堆栈中弹出两个值,从运算符堆栈中弹出一个值并推送结果

假设用户将此字符串输入程序:

  

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

我似乎无法弄清楚我是如何让C ++在阅读" 1"时解析字符串的?进入vals堆栈和" +"进入操作堆栈。如何通过字符串识别字符串中的双打,并将其与用户输入的操作符分开?

如果有人想要示例代码:

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());
}

感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

执行此操作的一种方法是使用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! */
    }
}

希望这有帮助!