Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- std::stringstream inputStream(input);
- char token;
- Token lastOperator;
- while (!inputStream.eof())
- {
- token = inputStream.get();
- Token inOperator = Token{ TokenTypes{token}, token };
- switch (token)
- {
- case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
- if (!outputStack.empty())
- {
- if (lastOperator == TokenTypes::NUMBER)
- {
- inOperator = Token{ TokenTypes::NUMBER, std::stoi(lastOperator.toString() + inOperator.toString()) };
- outputStack.pop();
- outputStack.push(inOperator);
- break;
- }
- }
- inOperator = Token{ TokenTypes::NUMBER, (int)(token - '0') };
- outputStack.push(inOperator);
- break;
- case '+': case '-': case '*': case '/': case '^':
- while (!operatorStack.empty() && (operatorStack.top() > inOperator || (operatorStack.top() == inOperator && inOperator.isLeftAssociative())) && operatorStack.top() != TokenTypes{ '(' })
- {
- outputStack.push(operatorStack.top());
- operatorStack.pop();
- }
- operatorStack.push(inOperator);
- break;
- case '(':
- operatorStack.push(inOperator);
- break;
- case ')':
- lastOperator = inOperator;
- while (operatorStack.top() != TokenTypes{ '(' })
- {
- inOperator = operatorStack.top();
- if (lastOperator == TokenTypes::NUMBER)
- inOperator = Token{ TokenTypes::NUMBER, std::stoi(lastOperator.toString() + inOperator.toString()) };
- outputStack.push(inOperator);
- operatorStack.pop();
- lastOperator = inOperator;
- }
- if (operatorStack.top() == TokenTypes{ '(' })
- operatorStack.pop();
- break;
- }
- lastOperator = inOperator;
- }
- while (!operatorStack.empty())
- {
- outputStack.push(operatorStack.top());
- operatorStack.pop();
- }
- size_t size = outputStack.size();
- std::vector<Token> tokens;
- for (size_t i = 0; i < size; i++)
- {
- tokens.push_back(outputStack.top());
- outputStack.pop();
- }
- //std::reverse(tokens.begin(), tokens.end());
- for (size_t i = 0; i < size; i++)
- outputStack.push(tokens[i]);
- /*std::string outputString;
- size_t stackSize = outputStack.size();
- for (size_t i = 0; i < stackSize; i++)
- {
- outputString += outputStack.top().toString() + ' ';
- outputStack.pop();
- }
- std::istringstream iss(outputstring);
- std::vector<std::string> splitstring{ std::istream_iterator<std::string>(iss), {} };
- std::reverse(splitstring.begin(), splitstring.end());
- std::ostringstream oss;
- std::copy(splitstring.begin(), splitstring.end(), std::ostream_iterator<std::string>(oss, " "));
- outputstring = oss.str();*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement