Esempio n. 1
0
        /*
         * Дан текстовый файл с программой на алгоритмическом языке. За один просмотр
         * файла проверить баланс круглых скобок в тексте, используя стек.
         */
        public static bool Task4(string[] text)
        {
            var stack = new MyStack <char>();

            foreach (var str in text)
            {
                foreach (var ch in str)
                {
                    if (ch == '(')
                    {
                        stack.Push(ch);
                    }
                    if (ch == ')' && stack.Count != 0)
                    {
                        stack.Pop();
                    }
                    else if (ch == ')' && stack.Count == 0)
                    {
                        return(false);
                    }
                }
            }
            if (stack.IsEmpty())
            {
                return(true);
            }
            return(false);
        }
Esempio n. 2
0
        /*
         *Дан текстовый файл. Используя стек, проверить, является ли содержимое
         * текстового файла правильной записью формулы вида:
         *< Формула > ::= < Терм > | < Терм > + < Формула > | < Терм > - < Формула >
         *< Терм > ::= < Имя > | (< Формула >)
         *< Имя > ::= x | y | z
         */
        public static bool Task11(string input)
        {
            if (!Task4(new string[] { input }))
            {
                Console.WriteLine("Некорректный синтаксис выражения.");
                return(false);
            }
            input = input.ToUpper();
            var stack = new MyStack <char>();
            var sout  = string.Empty;

            foreach (var c in input)
            {
                if (IsName(c))
                {
                    sout += c;
                    continue;
                }
                else
                {
                    switch (c)
                    {
                    case '(':
                    case '+':
                    case '-':
                        stack.Push(c);
                        break;

                    case ')':
                        while (stack.Peek() != '(')
                        {
                            sout += stack.Pop();
                        }
                        stack.Pop();
                        break;

                    default:
                    {
                        Console.WriteLine("Некорректный синтаксис выражения.");
                        return(false);
                    }
                    }
                }
            }
            while (!stack.IsEmpty())
            {
                sout += stack.Pop();
            }
            while (!IsName(sout[sout.Length - 1]))
            {
                if (IsName(sout[0]))
                {
                    stack.Push(sout[0]);
                    sout = sout.Substring(1);
                }
                else
                {
                    var oper = sout[0];
                    sout = sout.Substring(1);
                    switch (oper)
                    {
                    case '+':
                    case '-':
                        sout = PMoper() + sout;
                        break;

                    default:
                    {
                        Console.WriteLine("Некорректный синтаксис выражения.");
                        return(false);
                    }
                    }
                }
            }
            if (stack.Count != 0)
            {
                Console.WriteLine("Некорректный синтаксис выражения.");
                return(false);
            }
            return(true);

            char PMoper()
            {
                var first  = stack.Pop();
                var second = stack.Pop();

                if (first == 'X' || first == 'Y' || first == 'Z')
                {
                    if (second == 'X' || second == 'Y' || second == 'Z')
                    {
                        return('X');
                    }
                }
                return('T');
            }

            bool IsName(char c)
            {
                if (c == 'X' || c == 'Y' || c == 'Z')
                {
                    return(true);
                }
                return(false);
            }
        }
Esempio n. 3
0
        /*
         * Дан текстовый файл. В текстовом файле записана формула следующего вида:
         * <Формула> ::= <Цифра> | M(<Формула>,<Формула>) | N(Формула>,<Формула>)
         * < Цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
         * где буквами обозначены функции:
         * M – определение максимума, N – определение минимума.
         * Используя стек, вычислить значение заданного выражения
         */
        public static int Task10(string input)
        {
            if (!Task4(new string[] { input }))
            {
                Console.WriteLine("Некорректный синтаксис выражения.");
                return(-1);
            }
            input = input.ToUpper();
            var stack = new MyStack <char>();
            var sout  = string.Empty;

            foreach (var c in input)
            {
                if (char.IsDigit(c))
                {
                    sout += c;
                    continue;
                }
                else
                {
                    switch (c)
                    {
                    case '(':
                    case ',':
                    case 'M':
                    case 'N':
                        stack.Push(c);
                        break;

                    case ')':
                        if (stack.Peek() != ',')
                        {
                            Console.WriteLine("Некорректный синтаксис выражения.");
                            return(-1);
                        }
                        stack.Pop();
                        stack.Pop();
                        sout += stack.Pop();
                        break;

                    default:
                    {
                        Console.WriteLine("Некорректный синтаксис выражения.");
                        return(-1);
                    }
                    break;
                    }
                }
            }
            while (!stack.IsEmpty())
            {
                sout += stack.Pop();
            }
            while (!char.IsDigit(sout[sout.Length - 1]))
            {
                if (char.IsDigit(sout[0]))
                {
                    stack.Push(sout[0]);
                    sout = sout.Substring(1);
                }
                else
                {
                    var oper = sout[0];
                    sout = sout.Substring(1);
                    switch (oper)
                    {
                    case 'M':
                        sout = Max() + sout;
                        break;

                    case 'N':
                        sout = Min() + sout;
                        break;

                    default:
                    {
                        Console.WriteLine("Некорректный синтаксис выражения.");
                        return(-1);
                    }
                    break;
                    }
                }
            }
            if (stack.Count != 0)
            {
                Console.WriteLine("Некорректный синтаксис выражения.");
                return(-1);
            }
            int res = Math.Max(Math.Max(7, 9), Math.Min(3, 7));

            return(Convert.ToInt32(sout[0].ToString()));

            int Max()
            {
                int first  = Convert.ToInt32(stack.Pop().ToString());
                int second = Convert.ToInt32(stack.Pop().ToString());

                return(first >= second ? first : second);
            }

            int Min()
            {
                int first  = Convert.ToInt32(stack.Pop().ToString());
                int second = Convert.ToInt32(stack.Pop().ToString());

                return(first < second ? first : second);
            }
        }
Esempio n. 4
0
        /*
         * Дан текстовый файл. Используя стек, вычислить значение логического выражения,
         * записанного в текстовом файле в следующей форме:
         * < ЛВ > ::= T | F | (N<ЛВ>) | (<ЛВ>A<ЛВ>) | (<ЛВ>X<ЛВ>) | (<ЛВ>O<ЛВ>),
         * где буквами обозначены логические константы и операции:
         * T – True, F – False, N – Not, A – And, X – Xor, O – Or.
         */
        public static bool Task9(string input)
        {
            if (!Task4(new string[] { input }))
            {
                Console.WriteLine("Некорректный синтаксис выражения.");
                return(false);
            }
            input = input.ToUpper();
            var stack = new MyStack <char>();
            var sout  = string.Empty;

            foreach (var c in input)
            {
                if (IsConstant(c))
                {
                    sout += c;
                    continue;
                }
                else
                {
                    switch (c)
                    {
                    case '(':
                        stack.Push(c);
                        break;

                    case ')':
                        while (stack.Peek() != '(')
                        {
                            sout += stack.Pop();
                        }
                        stack.Pop();
                        break;

                    case 'A':
                    case 'O':
                    case 'X':
                    case 'N':
                        if (stack.IsEmpty())
                        {
                            stack.Push(c);
                        }
                        else
                        {
                            while (stack.Count > 0 && (GetPriority(c) <= stack.Peek()))
                            {
                                if ('(' == stack.Peek())
                                {
                                    break;
                                }
                                else
                                {
                                    sout += stack.Pop();
                                }
                            }
                            stack.Push(c);
                        }
                        break;

                    default:
                    {
                        Console.WriteLine("Некорректный синтаксис выражения.");
                        return(false);
                    }
                    break;
                    }
                }
            }
            while (!stack.IsEmpty())
            {
                sout += stack.Pop();
            }
            while (!IsConstant(sout[sout.Length - 1]))
            {
                if (IsConstant(sout[0]))
                {
                    stack.Push(sout[0]);
                    sout = sout.Substring(1);
                }
                else
                {
                    var oper = sout[0];
                    sout = sout.Substring(1);
                    switch (oper)
                    {
                    case 'A':
                        sout = AndOper() + sout;
                        break;

                    case 'O':
                        sout = OrOper() + sout;

                        break;

                    case 'X':
                        sout = XorOper() + sout;

                        break;

                    case 'N':
                        sout = DenyOper() + sout;

                        break;

                    default:
                        break;
                    }
                }
            }
            if (stack.Count != 0)
            {
                Console.WriteLine("Некорректный синтаксис выражения.");
                return(false);
            }
            bool res = (true && false) || (!false && (!false && true) && (!(true && (true ^ false) || (true & true))));

            if (sout[0] == 'T')
            {
                return(true);
            }
            return(false);

            char AndOper()
            {
                var first  = stack.Pop();
                var second = stack.Pop();

                if (first == 'F' || second == 'F')
                {
                    return('F');
                }
                return('T');
            }

            char OrOper()
            {
                var first  = stack.Pop();
                var second = stack.Pop();

                if (first == 'F' && second == 'F')
                {
                    return('F');
                }
                return('T');
            }

            char XorOper()
            {
                var first  = stack.Pop();
                var second = stack.Pop();

                if (first == 'F' && second == 'F' || second == 'T' && first == 'T')
                {
                    return('F');
                }
                return('T');
            }

            char DenyOper()
            {
                var first = stack.Pop();

                if (first == 'F')
                {
                    return('T');
                }
                return('F');
            }

            int GetPriority(char c)
            {
                switch (c)
                {
                case '(':
                    return(3);

                case 'N':
                case 'A':
                    return(2);

                case 'O':
                case 'X':
                    return(1);

                default:
                    break;
                }
                return(0);
            }

            bool IsConstant(char c)
            {
                if (c == 'T' || c == 'F')
                {
                    return(true);
                }
                return(false);
            }
        }