Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // infix expression evaluation
- // implemented with STL vector
- // evalues expression with multiple digit numbers, * / + - and {} [] () paratheis
- // assume the expression is well formatted with balanced braces.
- #include <iostream>
- #include <stack>
- #include <string>
- using namespace std;
- //----------------------------------------------------------------
- // Generates a stack of string tokens representing postfix
- // notation for the input line
- void generateRPN(string line, stack<string> &postfix);
- //----------------------------------------------------------------
- // Returns a the result of evaluating the passed postfix token
- // stack as a decimal string
- string evaluateRPN(stack<string> &postfix)
- {
- //this is going to be the reversed stack just to make it numbers first then operands later
- stack<string> reversedStack;
- // just going to push starting from the top of postfix stack
- int number1 = 0;
- int number2 = 0;
- int smallAnswer = 0;
- string ssmallAnswer;
- while (!postfix.empty()) {
- reversedStack.push(postfix.top());
- postfix.pop();
- }
- stack<string> numbersStack;
- while (!reversedStack.empty()) {
- if (isdigit(reversedStack.top()[0])) {
- numbersStack.push(reversedStack.top());
- reversedStack.pop();
- } else {
- if (reversedStack.top() == "-") {
- number2 = stoi(numbersStack.top());
- numbersStack.pop();
- number1 = stoi(numbersStack.top());
- numbersStack.pop();
- smallAnswer = number1 - number2;
- numbersStack.push(to_string(smallAnswer));
- } else if (reversedStack.top() == "+") {
- number2 = stoi(numbersStack.top());
- numbersStack.pop();
- number1 = stoi(numbersStack.top());
- numbersStack.pop();
- smallAnswer = number1 + number2;
- numbersStack.push(to_string(smallAnswer));
- } else if (reversedStack.top() == "*") {
- number2 = stoi(numbersStack.top());
- numbersStack.pop();
- number1 = stoi(numbersStack.top());
- numbersStack.pop();
- smallAnswer = number1 * number2;
- numbersStack.push(to_string(smallAnswer));
- } else { // (reversedStack.top() == "/")
- number2 = stoi(numbersStack.top());
- numbersStack.pop();
- number1 = stoi(numbersStack.top());
- numbersStack.pop();
- smallAnswer = number1 / number2;
- numbersStack.push(to_string(smallAnswer));
- }
- reversedStack.pop();
- }
- }
- return 0;
- }
- //----------------------------------------------------------------
- int main(int argc, char ** argv)
- {
- string line;
- cout << "Expression: ";
- while ( getline(cin, line) )
- {
- // skip empty line
- if (line.length() == 0)
- continue;
- // Makes line lowercase for checking to be case insensitive
- //transform(line.begin(), line.end(), line.begin(), ::toupper);
- // exits program if 'exit' is entered
- stack<string> postfix;
- generateRPN(line, postfix);
- cout << "Answer: " << evaluateRPN(postfix) << endl;
- line.clear();
- cout << "Expression: ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement