我正在尝试解决一个问题,该问题需要对类似10+20
的字符串中的简单表达式求值,而该返回值应返回30
问题是字符串可以包含空格,因此我将stringstring
与skipws
标志一起使用,它适用于字符串中的空格,例如10 + 20
等,但是当空格结尾时它没有正确通过。
这就是我解析字符串的方式
void build_stack(const string& str) {
istringstream ss(str);
char op;
int op1, op2;
ss>>skipws>>op1;
operands.push(op1);
while(!ss.eof()) {
ss>>op;
operators.push(op);
ss>>op2;
operands.push(op2);
}
}
具有各种字符串输入here in rextester的完整代码。
当字符串为3+5 / 2
时,我的堆栈将以
operands => 2 2 5 3
operators => / / +
当字符串为3+5 / 2
(即带有尾随空格)时,我的堆栈将构建为
operands => 2 5 3
operators => / +
我尝试过
while(ss.peek() == ' ') {
char c; ss>>c;
}
但这是在看到空格后删除所有字符。
答案 0 :(得分:0)
示例"3+5 / 2 "
:
ss>>skipws>>op1;
3被写入op1
operands.push(op1);
op1
被推入operands
while(!ss.eof()) {
是真的
ss>>op;
+
被写入op
operators.push(op);
op
被推入operators
ss>>op2;
5
被写入op2
operands.push(op2);
op2
被推入operands
while(!ss.eof()) {
是真的
ss>>op;
/
被写入op
operators.push(op);
op
被推入operators
ss>>op2;
2
被写入op2
operands.push(op2);
op2
被推入operands
,ss
包含空格,不能为空
while(!ss.eof()) {
是真的
ss>>op;
无法读取,/
停留在op
,已设置eof
operators.push(op);
op
被推入operators
ss>>op2;
无法读取,2
停留在op2
operands.push(op2);
op2
被推入operands
while(!ss.eof()) {
是错误的
与示例"3+5 / 2"
相比:
ss>>skipws>>op1;
3被写入op1
operands.push(op1);
op1
被推入operands
while(!ss.eof()) {
是真的
ss>>op;
+
被写入op
operators.push(op);
op
被推入operators
ss>>op2;
5
被写入op2
operands.push(op2);
op2
被推入operands
while(!ss.eof()) {
是真的
ss>>op;
/
被写入op
operators.push(op);
op
被推入operators
ss>>op2;
2
被写入op2
operands.push(op2);
op2
被推入operands
,ss
为空,设置为eof
while(!ss.eof()) {
是错误的
您可以使用
对其进行修复void build_stack(const string& str) {
istringstream ss(str);
char op;
int op1, op2;
ss>>skipws>>op1;
operands.push(op1);
while(true) {
if (!(ss>>op)) break;
operators.push(op);
if (!(ss>>op2)) break;
operands.push(op2);
}
}