Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- class CustomStack<T>
- {
- private List<T> elements; // Хранение элементов стека в списке
- public CustomStack()
- {
- elements = new List<T>(); // Инициализация списка элементов
- }
- public void Push(T item)
- {
- elements.Add(item); // Добавление элемента в стек
- }
- public T Pop()
- {
- if (IsEmpty()) // Если стек пуст
- {
- throw new InvalidOperationException("Стек пуст"); // Выбрасываем исключение
- }
- T item = elements[elements.Count - 1]; // Получаем верхний элемент
- elements.RemoveAt(elements.Count - 1); // Удаляем верхний элемент
- return item; // Возвращаем верхний элемент
- }
- public T Peek()
- {
- if (IsEmpty()) // Если стек пуст
- {
- throw new InvalidOperationException("Стек пуст"); // Выбрасываем исключение
- }
- return elements[elements.Count - 1]; // Возвращаем верхний элемент
- }
- public bool IsEmpty()
- {
- return elements.Count == 0; // Проверяем, пуст ли стек
- }
- public int Count
- {
- get { return elements.Count; } // Возвращаем количество элементов в стеке
- }
- }
- class Program
- {
- static int GetPriority(char op)
- {
- switch (op) // Определение приоритета операторов
- {
- case '+':
- case '-':
- return 1;
- case '*':
- case '/':
- return 2;
- case '^':
- return 3;
- default:
- return 0; // По умолчанию
- }
- }
- static string InfixToPostfix(string infix)
- {
- Stack<char> stack = new Stack<char>(); // Стек для операторов
- string postfix = ""; // Результирующая строка ПОЛИЗ
- for (int i = 0; i < infix.Length; i++) // Итерация по символам инфиксного выражения
- {
- char c = infix[i]; // Текущий символ
- if (char.IsDigit(c) || char.IsLetter(c)) // Если символ - цифра или буква
- {
- postfix += c; // Добавляем к ПОЛИЗ
- }
- else if (c == '(') // Если символ - открывающая скобка
- {
- stack.Push(c); // Помещаем в стек
- }
- else if (c == ')') // Если символ - закрывающая скобка
- {
- while (stack.Count > 0 && stack.Peek() != '(') // Пока не встретим открывающую скобку
- {
- postfix += stack.Pop(); // Извлекаем и добавляем к ПОЛИЗ
- }
- stack.Pop(); // Убираем открывающую скобку
- }
- else // Если символ - оператор
- {
- while (stack.Count > 0 && GetPriority(c) <= GetPriority(stack.Peek())) // Пока приоритет текущего оператора не меньше или равен верхнему оператору в стеке
- {
- postfix += stack.Pop(); // Извлекаем и добавляем к ПОЛИЗ
- }
- stack.Push(c); // Помещаем текущий оператор в стек
- }
- }
- while (stack.Count > 0) // Пока есть операторы в стеке
- {
- postfix += stack.Pop(); // Извлекаем и добавляем к ПОЛИЗ
- }
- return postfix; // Возвращаем ПОЛИЗ
- }
- static void Main()
- {
- Console.Write("Введите инфиксное выражение: ");
- string infixExpression = Console.ReadLine(); // Получаем инфиксное выражение от пользователя
- string postfixExpression = InfixToPostfix(infixExpression); // Переводим в ПОЛИЗ
- Console.WriteLine("Исходное инфиксное выражение: " + infixExpression);
- Console.WriteLine("ПОЛИЗ выражение: " + postfixExpression);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement