Пример #1
0
        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);
        }
Пример #2
0
        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());
        }
Пример #3
0
        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();
        }