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(); }