Advertisement
Mikhail-Podbolotov

Untitled

Apr 17th, 2025
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.09 KB | None | 0 0
  1. //// deepseek
  2. #include <iostream>
  3.  
  4. // Шаблонный класс Stack
  5. template <typename T>
  6. class Stack {
  7. private:
  8.     struct Node {
  9.         T data;
  10.         Node* next;
  11.         Node(const T& data, Node* next = nullptr) : data(data), next(next) {}
  12.     };
  13.  
  14.     Node* topNode;
  15.     size_t stackSize;
  16.  
  17. public:
  18.     Stack() : topNode(nullptr), stackSize(0) {}
  19.  
  20.     ~Stack() {
  21.         while (!empty()) {
  22.             pop();
  23.         }
  24.     }
  25.  
  26.     void push(const T& value) {
  27.         Node* newNode = new Node(value, topNode);
  28.         topNode = newNode;
  29.         stackSize++;
  30.     }
  31.  
  32.     void pop() {
  33.         if (empty()) {
  34.             std::cerr << "Error: Stack is empty, cannot pop\n";
  35.             return;
  36.         }
  37.  
  38.         Node* temp = topNode;
  39.         topNode = topNode->next;
  40.         delete temp;
  41.         stackSize--;
  42.     }
  43.  
  44.     T& top() {
  45.         if (empty()) {
  46.             std::cerr << "Error: Stack is empty, returning garbage value\n";
  47.             static T garbage;
  48.             return garbage;
  49.         }
  50.         return topNode->data;
  51.     }
  52.  
  53.     const T& top() const {
  54.         if (empty()) {
  55.             std::cerr << "Error: Stack is empty, returning garbage value\n";
  56.             static T garbage;
  57.             return garbage;
  58.         }
  59.         return topNode->data;
  60.     }
  61.  
  62.     bool empty() const {
  63.         return topNode == nullptr;
  64.     }
  65.  
  66.     size_t size() const {
  67.         return stackSize;
  68.     }
  69. };
  70.  
  71. // Вспомогательные функции для калькулятора
  72. bool isDigit(char c) {
  73.     return c >= '0' && c <= '9';
  74. }
  75.  
  76. double parseNumber(const char*& str) {
  77.     double num = 0;
  78.     bool negative = false;
  79.     bool decimal = false;
  80.     double decimalDivisor = 1.0;
  81.  
  82.     if (*str == '-') {
  83.         negative = true;
  84.         ++str;
  85.     }
  86.  
  87.     while (isDigit(*str) || *str == '.') {
  88.         if (*str == '.') {
  89.             decimal = true;
  90.             ++str;
  91.             continue;
  92.         }
  93.  
  94.         if (decimal) {
  95.             decimalDivisor *= 10;
  96.             num += (*str - '0') / decimalDivisor;
  97.         }
  98.         else {
  99.             num = num * 10 + (*str - '0');
  100.         }
  101.         ++str;
  102.     }
  103.  
  104.     return negative ? -num : num;
  105. }
  106.  
  107. // Функция вычисления выражения в ОПН
  108. double evaluateRPN(const char* expression) {
  109.     Stack<double> stack;
  110.  
  111.     while (*expression != '\0') {
  112.         // Пропускаем пробелы
  113.         if (*expression == ' ') {
  114.             ++expression;
  115.             continue;
  116.         }
  117.  
  118.         // Если цифра или минус (начало числа)
  119.         if (isDigit(*expression) || (*expression == '-' && isDigit(*(expression + 1)))) {
  120.             stack.push(parseNumber(expression));
  121.         }
  122.         else {
  123.             // Операция
  124.             if (stack.size() < 2) {
  125.                 std::cerr << "Error: Not enough operands for operation\n";
  126.                 return 0;
  127.             }
  128.  
  129.             double b = stack.top(); stack.pop();
  130.             double a = stack.top(); stack.pop();
  131.  
  132.             switch (*expression) {
  133.             case '+': stack.push(a + b); break;
  134.             case '-': stack.push(a - b); break;
  135.             case '*': stack.push(a * b); break;
  136.             case '/':
  137.                 if (b == 0) {
  138.                     std::cerr << "Error: Division by zero\n";
  139.                     return 0;
  140.                 }
  141.                 stack.push(a / b);
  142.                 break;
  143.             default:
  144.                 std::cerr << "Error: Unknown operator '" << *expression << "'\n";
  145.                 return 0;
  146.             }
  147.             ++expression;
  148.         }
  149.     }
  150.  
  151.     if (stack.size() != 1) {
  152.         std::cerr << "Error: Invalid expression format\n";
  153.         return 0;
  154.     }
  155.  
  156.     return stack.top();
  157. }
  158.  
  159. // Тестирование стека
  160. void testStack() {
  161.     std::cout << "=== Testing Stack ===\n";
  162.     Stack<int> s;
  163.  
  164.     s.push(1);
  165.     s.push(2);
  166.     s.push(3);
  167.  
  168.     std::cout << "Top: " << s.top() << " (expected 3)\n";
  169.     s.pop();
  170.     std::cout << "Top after pop: " << s.top() << " (expected 2)\n";
  171.     std::cout << "Size: " << s.size() << " (expected 2)\n";
  172.     std::cout << "Empty: " << (s.empty() ? "true" : "false") << " (expected false)\n";
  173.  
  174.     s.pop();
  175.     s.pop();
  176.     std::cout << "Empty after pops: " << (s.empty() ? "true" : "false") << " (expected true)\n";
  177.  
  178.     // Тест на пустом стеке
  179.     s.top(); // Должно вывести ошибку
  180.     s.pop(); // Должно вывести ошибку
  181. }
  182.  
  183. // Тестирование калькулятора
  184. void testCalculator() {
  185.     std::cout << "\n=== Testing RPN Calculator ===\n";
  186.  
  187.     const char* test1 = "3 4 +"; // 3 + 4 = 7
  188.     const char* test2 = "5 1 2 + 4 * +"; // 5 + (1 + 2) * 4 = 17
  189.     const char* test3 = "10 6 - 2 /"; // (10 - 6) / 2 = 2
  190.     const char* test4 = "3.5 2 *"; // 3.5 * 2 = 7
  191.     const char* test5 = "-5 3 +"; // -5 + 3 = -2
  192.  
  193.     std::cout << test1 << " = " << evaluateRPN(test1) << " (expected 7)\n";
  194.     std::cout << test2 << " = " << evaluateRPN(test2) << " (expected 17)\n";
  195.     std::cout << test3 << " = " << evaluateRPN(test3) << " (expected 2)\n";
  196.     std::cout << test4 << " = " << evaluateRPN(test4) << " (expected 7)\n";
  197.     std::cout << test5 << " = " << evaluateRPN(test5) << " (expected -2)\n";
  198.  
  199.     // Тест ошибок
  200.     std::cout << "\nTesting errors:\n";
  201.     evaluateRPN("1 2 + +"); // Недостаточно операндов
  202.     evaluateRPN("1 0 /");   // Деление на ноль
  203.     evaluateRPN("1 2 &");   // Неизвестный оператор
  204. }
  205.  
  206. int main() {
  207.     testStack();
  208.     testCalculator();
  209.  
  210.     // Интерактивный режим
  211.     std::cout << "\n=== Interactive RPN Calculator ===\n";
  212.     std::cout << "Enter expression (e.g. '3 4 + 2 *'), 'q' to quit\n";
  213.  
  214.     char input[256];
  215.     while (true) {
  216.         std::cout << "> ";
  217.         std::cin.getline(input, sizeof(input));
  218.  
  219.         if (input[0] == 'q') break;
  220.  
  221.         double result = evaluateRPN(input);
  222.         std::cout << "= " << result << "\n";
  223.     }
  224.  
  225.     return 0;
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement