예제 #1
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());
        }
예제 #2
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();
        }