Advertisement
hishlishter

Infix to Postfix Algorithm

Sep 27th, 2023
1,036
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.64 KB | Writing | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. class CustomStack<T>
  5. {
  6.     private List<T> elements; // Хранение элементов стека в списке
  7.  
  8.     public CustomStack()
  9.     {
  10.         elements = new List<T>(); // Инициализация списка элементов
  11.     }
  12.  
  13.     public void Push(T item)
  14.     {
  15.         elements.Add(item); // Добавление элемента в стек
  16.     }
  17.  
  18.     public T Pop()
  19.     {
  20.         if (IsEmpty()) // Если стек пуст
  21.         {
  22.             throw new InvalidOperationException("Стек пуст"); // Выбрасываем исключение
  23.         }
  24.  
  25.         T item = elements[elements.Count - 1]; // Получаем верхний элемент
  26.         elements.RemoveAt(elements.Count - 1); // Удаляем верхний элемент
  27.         return item; // Возвращаем верхний элемент
  28.     }
  29.  
  30.     public T Peek()
  31.     {
  32.         if (IsEmpty()) // Если стек пуст
  33.         {
  34.             throw new InvalidOperationException("Стек пуст"); // Выбрасываем исключение
  35.         }
  36.  
  37.         return elements[elements.Count - 1]; // Возвращаем верхний элемент
  38.     }
  39.  
  40.     public bool IsEmpty()
  41.     {
  42.         return elements.Count == 0; // Проверяем, пуст ли стек
  43.     }
  44.  
  45.     public int Count
  46.     {
  47.         get { return elements.Count; } // Возвращаем количество элементов в стеке
  48.     }
  49. }
  50.  
  51. class Program
  52. {
  53.     static int GetPriority(char op)
  54.     {
  55.         switch (op) // Определение приоритета операторов
  56.         {
  57.             case '+':
  58.             case '-':
  59.                 return 1;
  60.             case '*':
  61.             case '/':
  62.                 return 2;
  63.             case '^':
  64.                 return 3;
  65.             default:
  66.                 return 0; // По умолчанию
  67.         }
  68.     }
  69.  
  70.     static string InfixToPostfix(string infix)
  71.     {
  72.         Stack<char> stack = new Stack<char>(); // Стек для операторов
  73.         string postfix = ""; // Результирующая строка ПОЛИЗ
  74.  
  75.         for (int i = 0; i < infix.Length; i++) // Итерация по символам инфиксного выражения
  76.         {
  77.             char c = infix[i]; // Текущий символ
  78.  
  79.             if (char.IsDigit(c) || char.IsLetter(c)) // Если символ - цифра или буква
  80.             {
  81.                 postfix += c; // Добавляем к ПОЛИЗ
  82.             }
  83.             else if (c == '(') // Если символ - открывающая скобка
  84.             {
  85.                 stack.Push(c); // Помещаем в стек
  86.             }
  87.             else if (c == ')') // Если символ - закрывающая скобка
  88.             {
  89.                 while (stack.Count > 0 && stack.Peek() != '(') // Пока не встретим открывающую скобку
  90.                 {
  91.                     postfix += stack.Pop(); // Извлекаем и добавляем к ПОЛИЗ
  92.                 }
  93.                 stack.Pop(); // Убираем открывающую скобку
  94.             }
  95.             else // Если символ - оператор
  96.             {
  97.                 while (stack.Count > 0 && GetPriority(c) <= GetPriority(stack.Peek())) // Пока приоритет текущего оператора не меньше или равен верхнему оператору в стеке
  98.                 {
  99.                     postfix += stack.Pop(); // Извлекаем и добавляем к ПОЛИЗ
  100.                 }
  101.                 stack.Push(c); // Помещаем текущий оператор в стек
  102.             }
  103.         }
  104.  
  105.         while (stack.Count > 0) // Пока есть операторы в стеке
  106.         {
  107.             postfix += stack.Pop(); // Извлекаем и добавляем к ПОЛИЗ
  108.         }
  109.  
  110.         return postfix; // Возвращаем ПОЛИЗ
  111.     }
  112.  
  113.     static void Main()
  114.     {
  115.         Console.Write("Введите инфиксное выражение: ");
  116.         string infixExpression = Console.ReadLine(); // Получаем инфиксное выражение от пользователя
  117.         string postfixExpression = InfixToPostfix(infixExpression); // Переводим в ПОЛИЗ
  118.  
  119.         Console.WriteLine("Исходное инфиксное выражение: " + infixExpression);
  120.         Console.WriteLine("ПОЛИЗ выражение: " + postfixExpression);
  121.     }
  122. }
  123.  
Tags: C#
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement