2014-10-13 2 views
1
// FILE: calc.h 
#include <iostream> 
#include <stack> // Uses STL 
#include <string> // Uses STL 
using namespace std; 

void evaluate_stack_tops(stack<double> & numbers, stack<char> & operations); 

double read_and_evaluate(string line) 
{ 
    const char RIGHT_PARENTHESIS = ')'; 
    stack<double> numbers; // local stack object 
    stack<char> operations; // local stack object 
    double number; 
    char symbol; 
    size_t position = 0; 
    while (position < line.length()) 
    { 

     if (isdigit(line[position])) 
     { 
      number = line[position++] - '0'; // get value 
      numbers.push(number); 
     } 
     else if (strchr("+-*/", line[position]) != NULL) 
     { 
      symbol = line[position++]; 
      operations.push(symbol); 
     } 
     else if (line[position] == RIGHT_PARENTHESIS) 
     { 
      position++; 
      evaluate_stack_tops(numbers, operations); 
     } 
     else 
      position++; 
    } 
    if (!operations.empty()) 
     evaluate_stack_tops(numbers, operations); 
    return numbers.top(); 
} 

void evaluate_stack_tops(stack<double> & numbers, stack<char> & operations) 
{ 
    double operand1, operand2; 
    operand2 = numbers.top(); 
    numbers.pop(); 
    operand1 = numbers.top(); 
    numbers.pop(); 
    switch (operations.top()) 
    { 
    case '+': numbers.push(operand1 + operand2); break; 
    case '-': numbers.push(operand1 - operand2); break; 
    case '*': numbers.push(operand1 * operand2); break; 
    case '/': numbers.push(operand1/operand2); break; 
    } 
    operations.pop(); 
} 


// FILE: Use_Stack.cpp 
#include <iostream> 
using namespace std; 
#include "calc.h" 

int main() 
{ 
    double answer; 
    string line; 
    cout << "Type a fully parenthesized arithmetic expression (SINGLE DIGITS ONLY!):\n"; 
    getline(cin, line); 
    answer = read_and_evaluate(line); 
    cout << "That evaluates to " << answer << endl; 
    system("pause"); 
    return 0; 
} 

Все работает, и я могу вводить простые вещи типа «2 4 3 * + 7 - 2 +», но если бы я хотел ввести что-то вроде «123 60 +», это не сработает. я разделил его на два файла заголовка. Может ли кто-нибудь дать мне подсказку о том, как принимать многозначные целые числа?Как добавить многозначные целые числа в калькулятор с обратной полярностью

+0

возможно дубликат [Как разобрать строку в междунар в C++] (http://stackoverflow.com/questions/194465/ how-to-parse-a-string-to-an-int-in-c) –

ответ

0

Одним из способов решения проблемы является то, что вы обнаруживаете число, вместо того, чтобы предполагать, что оно имеет только одну цифру, используйте цикл, чтобы собрать все остальные цифры, которые являются частью числа. Цикл завершится, когда он встретит не цифру, или пробел.

Лучшим способом сделать это будет токенизация входной строки с использованием stringstream. В этом случае, вы бы поставить всю строку ввода в строку, а затем использовать время цикл, подобный следующему:

stringstream ss(line); 
string token; 
while (ss >> token) { 
    // do stuff with token 
} 
+0

Спасибо, я попробую! – emanuel

0

RPN работает, имея стек значений, которые вы манипулируете. С учетом ввода "13", манипуляции, необходимые для перехода от top=1 к top=13 довольно прост: top = 10 * top + digit