自从我使用C++工作以来,已经有相当一段时间了,我正在努力解决postfix符号。看来pop没有正常工作,数字没有被重写。
这是我的代码。
int main() {
string input;
string num = "";
int i;
int a,b,c;
vector< int > numbers;
getline(cin,input);
for(i=0; i<input.length(); i++) {
if(input[i] >= '0' && input[i] <= '9') { //creating multi digit number
num.push_back(input[i]);
if(i == input.length()) {
istringstream(num) >> c;
numbers.push(c);
}
} else if(input[i] == ' ') {
istringstream(num) >> c;
numbers.push(c);
num = "";
}
if (input[i]=='+') {
b = numbers[numbers.size() - 1];
a = numbers[numbers.size() - 2];
numbers.pop_back();numbers.pop_back();
numbers.push_back(a+b));
continue;
}
if (input[i]=='*') {
b = numbers[numbers.size() - 1];
a = numbers[numbers.size() - 2];
numbers.pop_back();numbers.pop_back();
numbers.push_back(a*b));
continue;
}
if (input[i]=='/') {
b = numbers[numbers.size() - 1];
a = numbers[numbers.size() - 2];
numbers.pop_back();numbers.pop_back();
numbers.push_back(a/b));
continue;
}
if (input[i]=='-') {
b = numbers[numbers.size() - 1];
a = numbers[numbers.size() - 2];
numbers.pop_back();numbers.pop_back();
numbers.push_back(a-b));
continue;
}
}
if(numbers.size() > 1 && i != input.length() -1) {
return 0;
}
cout << numbers.top();
return 0;
}
基本上它看起来像结果没有被推到堆栈的顶端. 例如55 5 - 2 *将进入操作,如:
所以我不知道是pop_back还是push_back不工作。
有人能给我一个提示吗?
我增强了代码。
#include <iostream>
#include <stack>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
void print_numbers(vector <int> numbers, char op) {
for(int i = 0; i < numbers.size(); i++){
cout << op << ": " << numbers[i] << " ";
}
cout << endl;
}
int main() {
string input;
string num = "";
int i;
int a,b,c;
vector< int > numbers;
getline(cin,input);
for(i=0; i<input.length(); i++) {
if(input[i] >= '0' && input[i] <= '9') {
num.push_back(input[i]);
if(i == input.length() -1) {
istringstream(num) >> c;
numbers.push_back(c);
}
} else if(input[i] == ' ') {
istringstream(num) >> c;
numbers.push_back(c);
num = "";
}
if (input[i]=='+') {
b = numbers[numbers.size() - 1];
a = numbers[numbers.size() - 2];
numbers.pop_back();numbers.pop_back();
numbers.push_back(a+b);
continue;
}
if (input[i]=='*') {
print_numbers(numbers,'*');
b = numbers[numbers.size() - 1];
a = numbers[numbers.size() - 2];
numbers.pop_back();numbers.pop_back();
numbers.push_back(a*b);
print_numbers(numbers,'*');
continue;
}
if (input[i]=='/') {
b = numbers[numbers.size() - 1];
a = numbers[numbers.size() - 2];
numbers.pop_back();numbers.pop_back();
numbers.push_back(a/b);
continue;
}
if (input[i]=='-') {
b = numbers[numbers.size() - 1];
a = numbers[numbers.size() - 2];
print_numbers(numbers,'-');
numbers.pop_back();numbers.pop_back();
numbers.push_back(a-b);
print_numbers(numbers,'-');
continue;
}
}
print_numbers(numbers,' ');
cout << numbers[numbers.size() - 1];
return 0;
}
on input: 55 5 - 2 *
输出。
1. -: 55 -: 5
2. -: 50
3. *: 50 *: 5 *: 2
4. *: 50 *: 10
5. : 50 : 10
6. 10
看来正确的数字被放置在步骤nr2中,但看起来缓冲区也是nr5的。
所以问题是在 -
的输入。下一个字符是一个空格,所以你要输入这个密码
} else if(input[i] == ' ') {
istringstream(num) >> c;
numbers.push_back(c);
num = "";
}
试图将另一个数字推到堆栈上。但是 num
此时为空,这意味着 istringstream(num) >> c;
失败,所以变量 c
是不变的。下一行 c
被推到堆栈上,但 c
依然是前一个数字的旧值5。这就解释了为什么同样的数字会被推后两次。
一个解决方案是这样的
} else if(input[i] == ' ' && num != "") {
istringstream(num) >> c;
numbers.push_back(c);
num = "";
}
我花了两分钟的时间用调试器弄明白了这个问题。也许你该学学如何使用调试器了?
if (i == input.length()) {
istringstream(num) >> c;
numbers.push(c);
}
应该是
if (i + 1 == input.length()) {
istringstream(num) >> c;
numbers.push(c);
}
i
不啻 input.length()
,看看for循环条件。