C++ 后缀表示法 - 评估
C++ postfix notation - evaluation
自从我使用 C++ 以来已经有一段时间了,我正在努力解决后缀表示法。看起来 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 * 将像这样运行:
- 55 - 5
- 5 * 2(而不是 50 * 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;
}
输入:55 5 - 2 *
输出:
1. -: 55 -: 5
2. -: 50
3. *: 50 *: 5 *: 2
4. *: 50 *: 10
5. : 50 : 10
6. 10
所以看起来正确的数字放在步骤 nr2 中。但看起来缓冲区也再次与 nr 5
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循环条件
所以问题是输入中的 -
之后会发生什么。下一个字符是 space 所以你输入这个代码
} 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 = "";
}
我花了两分钟时间才用调试器解决了这个问题。也许你学会了如何使用它?
自从我使用 C++ 以来已经有一段时间了,我正在努力解决后缀表示法。看起来 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 * 将像这样运行:
- 55 - 5
- 5 * 2(而不是 50 * 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;
}
输入:55 5 - 2 *
输出:
1. -: 55 -: 5
2. -: 50
3. *: 50 *: 5 *: 2
4. *: 50 *: 10
5. : 50 : 10
6. 10
所以看起来正确的数字放在步骤 nr2 中。但看起来缓冲区也再次与 nr 5
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循环条件
所以问题是输入中的 -
之后会发生什么。下一个字符是 space 所以你输入这个代码
} 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 = "";
}
我花了两分钟时间才用调试器解决了这个问题。也许你学会了如何使用它?