我一直在乱用算法和一本书,我读过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());
}
感谢任何帮助!
答案 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! */
}
}
希望这有帮助!