【发布时间】:2020-05-16 09:11:14
【问题描述】:
自从我使用 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
【问题讨论】:
-
这段代码应该做什么?你能给出一个更短的简单例子吗?
-
push_back和pop_back不存在std::stack,它应该是push和pop。operator[]也没有。此代码不应编译,看起来一半代码使用向量,一半使用堆栈。 -
55 5 + 2 * 应该做例如 (55 + 5) * 2。@john 它曾经是向量
-
减法和除法的操作数以错误的顺序压入堆栈。您必须在评估期间对此进行补偿。
-
你能解释一下吗?
标签: c++ postfix-notation