static string ToPostfix(string input) { string result = ""; //Stack<char> stack = new Stack<char>(); MyStack <char> stack = new MyStack <char>(); //Queue<char> queue = new Queue<char>(); MyQueue <char> queue = new MyQueue <char>(); for (int i = 0; i < input.Length; i++) { if (isDigit(input[i])) // Если входящий элемент число { queue.Enqueue(input[i]); // то добавляем его в очередь } else if (isOperator(input[i])) // Если входящий элемент оператор (+, -, *, /) то проверяем { if ((stack.Count == 0) || (stack.Peek() == '(')) // Если стек пуст или содержит левую скобку в вершине { stack.Push(input[i]); // то добавляем входящий оператор в стек } else if (CompareRank(input[i], stack.Peek()) > 0) // Если входящий оператор имеет более высокий приоритет чем вершина { stack.Push(input[i]); // поместить его в стек } else // Если входящий оператор имеет более низкий или равный приоритет, чем вершина { do { // выгружаем из стэка в очередь queue.Enqueue(stack.Pop()); } // пока не увидим оператор с меньшим приоритетом или левую скобку на вершине while ((stack.Count > 0) && (stack.Peek() != '(') && (CompareRank(input[i], stack.Peek()) >= 0)); stack.Push(input[i]); // затем добавить входящий оператор в стек } } else if (input[i] == '(') // Если входящий элемент является левой скобкой { stack.Push(input[i]); // поместить его в стек } else if (input[i] == ')') // Если входящий элемент является правой скобкой { while (stack.Peek() != '(') // то пока не увидим левую скобку { queue.Enqueue(stack.Pop()); // выгружаем стек и добавляем его элементы в очередь } stack.Pop(); // Удалить найденную скобку из стека } } // В конце выражения выгрузить стек в очередь while (stack.Count > 0) { queue.Enqueue(stack.Pop()); } // и очередь в строку while (queue.Count > 0) { result += queue.Dequeue(); } return(result); }
static int CalcPostfix(string input) { //Stack<int> stack = new Stack<int>(); MyStack <int> stack = new MyStack <int>(); int digit, x, y; for (int i = 0; i < input.Length; i++) { // Если входящий элемент является числом if (int.TryParse(input[i].ToString(), out digit)) { stack.Push(digit); // поместить его в стек (STACK) } //Если входящий элемент является оператором (*-/+) else { // необходимо получить два последних числа из стека y = stack.Pop(); x = stack.Pop(); // и выполнить соответствующую операцию. // Далее поместить полученный результат в стек switch (input[i]) { case '+': stack.Push(x + y); break; case '-': stack.Push(x - y); break; case '*': stack.Push(x * y); break; case '/': stack.Push(x / y); break; default: throw new ArgumentException("wrong input"); } } } // Когда выражение закончится, число на вершине стека является результатом. return(stack.Pop()); }
static void Main(string[] args) { #region Задание 3: //Написать программу, которая определяет, является ли введённая скобочная последовательность правильной. //Примеры правильных скобочных выражений – (), ([])(), {}(), ([{}]), неправильных – )(, ())({), (, ])}), ([(]), для скобок – [, (, {. //Например: (2 + (2 * 2)) или[2 /{ 5 * (4 + 7)}]. string sequence = "[2 /{ 5 * (4 + 7)}]"; MyStack <char> ms = new MyStack <char>(); int flag = 1; for (int i = 0; i < sequence.Length; i++) { if (sequence[i].Equals('(') || sequence[i].Equals('[') || sequence[i].Equals('{')) { ms.Push(sequence[i]); } else if (sequence[i].Equals(')')) { if (ms.Length == 0) { flag = 0; break; } else if (ms.LastItem.Equals('(')) { ms.Pop(); } else { flag = 0; break; } } else if (sequence[i].Equals(']')) { if (ms.Length == 0) { flag = 0; break; } else if (ms.LastItem.Equals('[')) { ms.Pop(); } else { flag = 0; break; } } else if (sequence[i].Equals('}')) { if (ms.Length == 0) { flag = 0; break; } else if (ms.LastItem.Equals('{')) { ms.Pop(); } else { flag = 0; break; } } } if (flag == 1 && ms.Length == 0) { Console.WriteLine($"В записи {sequence} скобочная последовательность верная"); } else { Console.WriteLine($"В записи {sequence} скобочная последовательность задана не верно"); } Console.WriteLine(""); #endregion #region Задание 5: // *Реализовать алгоритм перевода из инфиксной записи арифметического выражения в постфиксную. //Например, "3 * (1 + 22 - 3) + 44 / 2 в 3 1 22 + 3 - * 44 2 / + string inflixNote = "3 * (1 + 22 - 3) + 44 / 2"; string postfixNote = ""; MyStack <string> stack = new MyStack <string>(); string tmp; for (int i = 0; i < inflixNote.Length; i++) { if (CheckNumber((int)inflixNote[i]) == 1) { tmp = inflixNote[i].ToString(); while (i != inflixNote.Length - 1 && CheckNumber((int)inflixNote[i + 1]) == 1) { tmp = tmp + inflixNote[++i]; } postfixNote = postfixNote + tmp + " "; } else if (inflixNote[i].Equals('(')) { stack.Push(inflixNote[i].ToString()); } else if (inflixNote[i].Equals('*') || inflixNote[i].Equals('/')) { while (stack.Length != 0 && (stack.LastItem.Equals('*') || stack.LastItem.Equals('/'))) { postfixNote = postfixNote + stack.Pop() + " "; } stack.Push(inflixNote[i].ToString()); } else if (inflixNote[i].Equals('-') || inflixNote[i].Equals('+')) { while (stack.Length != 0 && !stack.LastItem.Equals("(")) { postfixNote = postfixNote + stack.Pop() + " "; } stack.Push(inflixNote[i].ToString()); } else if (inflixNote[i].Equals(')')) { while (stack.Length != 0 && !stack.LastItem.Equals("(")) { postfixNote = postfixNote + stack.Pop() + " "; } stack.Pop(); } } while (stack.Length != 0) { postfixNote = postfixNote + stack.Pop(); } Console.WriteLine($"Инфиксная запись: {inflixNote}\nПостфиксная запись: {postfixNote}"); #endregion Console.ReadKey(); }