У меня есть файл, который содержит текст в RPN, каждая строка отличается. Давайте возьмем первую строку, например:
12 2 3 4 * 10 5 / + * +
Мне нужно сосчитать по каждой строке. Для этого мне нужно использовать стек. Это работает так: если есть число -> добавить его в стек, если это +, -, * или / -> взять два новейших числа в стеке и выполнить с ними указанную операцию.
Проблема в том, что я застрял в момент чтения файла. Я думал о сохранении чисел и знаков в массиве, но у меня есть еще одна проблема:
Если (массив хранит символы):
array[0] = '1',
array[1] = '2',
array[2] = ' ',
как мне сделать это в int 12 (пробел означает, что это конец числа)? Есть ли простой и короткий способ сделать это?
Или, может быть, есть лучший способ прочитать файл и поместить его в стек?
Благодаря предложениям по использованию строк для хранения данных, я сделал это, вот реализация:
#include <iostream>
#include <fstream>
#include <string>
#include <stack>
using namespace std;
int main(){
stack <int> stos;//the name is a bit weird but it's just 'stack' in polish
ifstream in("Test1.txt");//opening file to read from
string linia;//again - "linia" is just "line" in polish
int i = 1;//gonna use that to count which line i'm in
while (getline(in, linia, ' ')){
if (linia == "*"){
int b = stos.top();
stos.pop();
int a = stos.top();
stos.pop();
stos.push(a*b);
}
else if (linia == "+"){
int b = stos.top();
stos.pop();
int a = stos.top();
stos.pop();
stos.push(a+b);
}
else if (linia == "-"){
int b = stos.top();
stos.pop();
int a = stos.top();
stos.pop();
stos.push(a-b);
}
else if (linia == "/" || linia == "%"){
int b = stos.top();
stos.pop();
int a = stos.top();
stos.pop();
int c = a / b;
stos.push(c);
}
else if (linia == "\n"){
cout << "Wynik nr " << i << ": " << stos.top() << endl;
stos.pop();
i++;
}
else{//if it's a number
stos.push(atoi(linia.c_str()));
}
}
}
Файл выглядит так:
12 2 3 4 * 10 5 / + * +
2 7 + 3 / 14 3 - 4 * +
Необходим пробел перед каждой строкой, которая не является первой строкой, в противном случае программа возьмет «\ n» вместе с первым номером следующей строки, что нам не нужно.
Посмотри на это:
#include <fstream>
#include <sstream>
#include <string>
void parseLine(const std::string& line) {
std::stringstream stream(line);
std::string token;
while(stream >> token) {
// Do whatever you need with the token.
}
}
int main() {
std::ifstream input("input.txt");
std::string line;
while(std::getline(input, line)) {
parseLine(line);
}
}
Других решений пока нет …