예제 #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 void Task06()
        {
            //Реализовать очередь с использованием массива.
            //Пример использования созданной очереди
            MyQueue <int> myQueue = new MyQueue <int>(5);

            for (int i = 0; i < 7; i++)
            {
                myQueue.Enqueue(i + 1);
            }
            for (int i = 0; i < 3; i++)
            {
                myQueue.Dequeue();
            }
            for (int i = 0; i < 5; i++)
            {
                myQueue.Enqueue(i + 10);
            }
            FC.Pause();
        }