fork download
  1. #include <iostream>
  2. #include <stack>
  3. #include <string>
  4. #include <sstream>
  5. #include <vector>
  6. #include <cctype> // for isdigit
  7.  
  8. using namespace std;
  9.  
  10. bool isNumber(const string &s) {
  11. if (s.empty()) return false;
  12. size_t start = 0;
  13. if (s[0] == '-') {
  14. if (s.size() == 1) return false; // Only '-'
  15. start = 1;
  16. }
  17. for (size_t i = start; i < s.size(); ++i) {
  18. if (!isdigit(s[i])) {
  19. return false;
  20. }
  21. }
  22. return true;
  23. }
  24.  
  25. int main() {
  26. int t;
  27. cin >> t;
  28. cin.ignore();
  29.  
  30. while (t--) {
  31. int n;
  32. cin >> n;
  33. cin.ignore();
  34.  
  35. string line;
  36. getline(cin, line);
  37.  
  38. vector<string> tokens;
  39. stringstream ss(line);
  40. string token;
  41. while (ss >> token) {
  42. tokens.push_back(token);
  43. }
  44.  
  45. if (tokens.size() != n) {
  46. cout << "Invalid Expression" << endl;
  47. continue;
  48. }
  49.  
  50. stack<long long> st;
  51. bool valid = true;
  52.  
  53. for (int i = tokens.size() - 1; i >= 0; --i) {
  54. string tok = tokens[i];
  55.  
  56. if (isNumber(tok)) {
  57. st.push(stoll(tok));
  58. } else if (tok == "+" || tok == "-" || tok == "*" || tok == "/") {
  59. if (st.size() < 2) {
  60. valid = false;
  61. break;
  62. }
  63. long long a = st.top(); st.pop();
  64. long long b = st.top(); st.pop();
  65.  
  66. if (tok == "+") st.push(a + b);
  67. else if (tok == "-") st.push(a - b);
  68. else if (tok == "*") st.push(a * b);
  69. else if (tok == "/") {
  70. if (b == 0) {
  71. valid = false;
  72. break;
  73. }
  74. st.push(a / b);
  75. }
  76. } else {
  77. valid = false;
  78. break;
  79. }
  80. }
  81.  
  82. if (valid && st.size() == 1) {
  83. cout << st.top() << endl;
  84. } else {
  85. cout << "Invalid Expression" << endl;
  86. }
  87. }
  88.  
  89. return 0;
  90. }
Success #stdin #stdout 0.01s 5288KB
stdin
2
7
+ * - 5 4 100 20
3
- 4 7 
stdout
120
-3