/* * Дан текстовый файл с программой на алгоритмическом языке. За один просмотр * файла проверить баланс круглых скобок в тексте, используя стек. */ 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); }
/* *Дан текстовый файл. Используя стек, проверить, является ли содержимое * текстового файла правильной записью формулы вида: *< Формула > ::= < Терм > | < Терм > + < Формула > | < Терм > - < Формула > *< Терм > ::= < Имя > | (< Формула >) *< Имя > ::= 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); } }
/* * Дан текстовый файл. В текстовом файле записана формула следующего вида: * <Формула> ::= <Цифра> | 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); } }
/* * Дан текстовый файл. Используя стек, вычислить значение логического выражения, * записанного в текстовом файле в следующей форме: * < ЛВ > ::= 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); } }