Example #1
0
        /*
         * Даны три стержня и n дисков различного размера. Диски можно надевать на
         * cтержни, образуя из них башни. Перенести n дисков со стержня А на стержень С,
         * сохранив их первоначальный порядок. При переносе дисков необходимо соблюдать
         * следующие правила:- на каждом шаге со стержня на стержень переносить только один диск;
         * - диск нельзя помещать на диск меньшего размера;
         * - для промежуточного хранения можно использовать стержень В.
         * Реализовать алгоритм, используя три стека вместо стержней А, В, С. Информация о дисках хранится в исходном файле.*/
        public static MyDeque <Plate> Task3(Plate[] input)
        {
            var res    = new MyDeque <Plate>();
            var stacks = new MyStack <Plate>[3] {
                new MyStack <Plate>(), new MyStack <Plate>(), new MyStack <Plate>()
            };

            foreach (var item in input)
            {
                stacks[0].Push(item);
            }
            PlacePlate(stacks[0], stacks[2], stacks[1], stacks[0].Count);
            foreach (var item in stacks[2])
            {
                res.Enqueue(item);
            }
            return(res);

            void PlacePlate(MyStack <Plate> first, MyStack <Plate> third, MyStack <Plate> second, int count)
            {
                if (count != 0)
                {
                    PlacePlate(first, second, third, count - 1);
                    third.Push(first.Pop());
                    PlacePlate(second, third, first, count - 1);
                }
            }
        }
Example #2
0
        /*
         * Отсортировать строки файла, содержащие названия книг, в алфавитном порядке с
         * использованием двух деков.
         */
        public static MyDeque <T> Task1 <T>(MyDeque <T> input) where T : IComparable <T>
        {
            var first  = new MyDeque <T>();
            var second = new MyDeque <T>();

            first.Dequeue(input.RemoveFirst());
            while (input.Count > 0)
            {
                var temp = input.RemoveFirst();
                if (temp.CompareTo(first.PopHead()) <= 0)        //если temp должен быть перед первым
                {
                    first.Dequeue(temp);                         //ставим в первый дек в начало
                }
                else if (temp.CompareTo(first.PopTail()) < 0)    //если temp должен быть перед последним
                {
                    while (temp.CompareTo(first.PopTail()) <= 0) //пока temp не будет >= first.Tail
                    {
                        second.Enqueue(first.RemoveLast());
                    }
                    first.Enqueue(temp);
                    while (second.Count > 0)
                    {
                        first.Enqueue(second.RemoveLast());
                    }
                }
                else
                {
                    first.Enqueue(temp);
                }
            }
            return(first);
        }
Example #3
0
        public static string Task2_encrypt(string message, string key)
        {
            var myDeq = new MyDeque <char>();
            var res   = "";

            foreach (var ch in key)
            {
                myDeq.Enqueue(ch);
            }
            foreach (var ch in message)
            {
                while (myDeq.PopTail() != ch)
                {
                    myDeq.Dequeue(myDeq.RemoveLast());
                }
                myDeq.Dequeue(myDeq.RemoveLast());
                myDeq.Dequeue(myDeq.RemoveLast());
                res += myDeq.PopTail();
                myDeq.Enqueue(myDeq.RemoveFirst());
                myDeq.Enqueue(myDeq.RemoveFirst());
            }
            return(res);
        }
Example #4
0
        /*
         * Дан файл из целых чисел. Используя дек, за один просмотр файла напечатать
         * сначала все отрицательные числа, затем все положительные числа, сохраняя
         * исходный порядок в каждой группе.
         */
        public static void Task7(string[] text)
        {
            string str = null;

            foreach (var st in text)
            {
                str += st + ' ';
            }
            var strings = str.Trim().Split(' ');
            var nums    = new List <int>();

            foreach (var st in strings)
            {
                nums.Add(int.Parse(st));
            }
            var deq = new MyDeque <int>();

            foreach (var num in nums)
            {
                if (num < 0)
                {
                    deq.Enqueue(num);
                }
            }
            foreach (var num in nums)
            {
                if (num >= 0)
                {
                    deq.Enqueue(num);
                }
            }
            foreach (var item in deq)
            {
                Console.Write(item + " ");
            }
        }
Example #5
0
        /*
         * Дан текстовый файл с программой на алгоритмическом языке. За один просмотр
         * файла проверить баланс квадратных скобок в тексте, используя дек.
         */
        public static bool Task5(string[] text)
        {
            var deq = new MyDeque <char>();

            foreach (var str in text)
            {
                foreach (var ch in str)
                {
                    if (ch == '[')
                    {
                        deq.Dequeue(ch);
                    }
                    if (ch == ']')
                    {
                        deq.Enqueue(ch);
                    }
                }
            }
            while (deq.Count > 1)
            {
                if (deq.PopHead() == '[' && deq.PopTail() == ']')
                {
                    deq.RemoveFirst();
                    deq.RemoveLast();
                }
                else
                {
                    return(false);
                }
            }
            if (deq.IsEmpty())
            {
                return(true);
            }
            return(false);
        }
Example #6
0
        /*
         * Дек содержит последовательность символов для шифровки сообщений. Дан
         * текстовый файл, содержащий зашифрованное сообщение. Пользуясь деком,
         * расшифровать текст. Известно, что при шифровке каждый символ сообщения
         * заменялся следующим за ним в деке по часовой стрелке через один.
         */
        public static string Task2_crypt(string message, string key, string path_to_save)
        {
            var myDeq = new MyDeque <char>();
            var res   = "";

            foreach (var ch in key)
            {
                myDeq.Enqueue(ch);
            }
            foreach (var ch in message)
            {
                while (myDeq.PopHead() != ch)
                {
                    myDeq.Enqueue(myDeq.RemoveFirst());
                }
                myDeq.Enqueue(myDeq.RemoveFirst());
                myDeq.Enqueue(myDeq.RemoveFirst());
                res += myDeq.PopHead();
                myDeq.Dequeue(myDeq.RemoveLast());
                myDeq.Dequeue(myDeq.RemoveLast());
            }
            File.WriteAllText(path_to_save, res);
            return(res);
        }
Example #7
0
        internal static void Run4Lab()
        {
            Random    rnd      = new Random();
            Stopwatch sw       = new Stopwatch();
            string    filename = "Books.txt";
            string    dir      = Directory.GetCurrentDirectory();

            while (!File.Exists(dir + Path.DirectorySeparatorChar + filename))
            {
                dir = dir.Substring(0, dir.LastIndexOf('\\'));
            }
#if stack
            #region Stack
            MyStack <int> stack = new MyStack <int>();
            stack.Push(0);
            stack.Push(3);
            var peek = stack.Peek();
            stack.Pop();
            stack.Pop();
            #endregion
#endif
#if deque
            #region Deque
            MyDeque <int> deque = new MyDeque <int>();
            deque.Enqueue(5);
            deque.Dequeue(4);
            var head  = deque.PopHead();
            var tail  = deque.PopTail();
            var first = deque.RemoveFirst();
            var last  = deque.RemoveLast();
            #endregion
#endif
            #region Tasks
            #region Task1
            Console.WriteLine("Task 1");
            Console.WriteLine();
            MyDeque <string> deq1 = new MyDeque <string>();
            using (StreamReader reader = new StreamReader(dir + Path.DirectorySeparatorChar + filename))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    deq1.Enqueue(line);
                }
            }
            var t1res = Task1(deq1);
            foreach (var item in t1res)
            {
                Console.WriteLine(item);
            }
            #endregion
            #region Task2
            Console.WriteLine("Task 2");
            Console.WriteLine();

            filename = "SourceMessage.txt";
            string path = dir + Path.DirectorySeparatorChar + filename;
            if (!File.Exists(path))
            {
                File.WriteAllText(path, "This message will be crypted!");
            }
            var message = File.ReadAllText(path);
            var key     = Task2_keygen(message);
            filename = "CryptedMessage.txt";
            path     = dir + Path.DirectorySeparatorChar + filename;
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            string t2crypt   = Task2_crypt(message, key, path);
            string t2encrypt = Task2_encrypt(t2crypt, key);
            filename = "SourceMessage.txt";
            path     = dir + Path.DirectorySeparatorChar + filename;
            Console.WriteLine("Сообщения для шифрования: " + File.ReadAllText(path));
            Console.WriteLine("Зашифрованное сообщение: " + t2crypt);
            Console.WriteLine("Расшифрованное сообщение: " + t2encrypt);

            #endregion
            #region Task3
            Console.WriteLine("Task 3");
            Console.WriteLine();
            filename = "StackData.txt";
            Plate           plate6 = new Plate(9);
            Plate           plate5 = new Plate(7);
            Plate           plate4 = new Plate(4);
            Plate           plate3 = new Plate(4);
            Plate           plate2 = new Plate(2);
            Plate           plate1 = new Plate(1);
            Plate[]         plates = new Plate[] { plate6, plate5, plate4, plate3, plate2, plate1 };
            BinaryFormatter bf     = new BinaryFormatter();
            using (FileStream fs = new FileStream(dir + Path.DirectorySeparatorChar + filename, FileMode.OpenOrCreate))
            {
                bf.Serialize(fs, plates);
            }
            using (FileStream fs = new FileStream(dir + Path.DirectorySeparatorChar + filename, FileMode.OpenOrCreate))
            {
                plates = bf.Deserialize(fs) as Plate[];
            }
            var t3res = Task3(plates);
            foreach (var item in t3res)
            {
                for (int i = 0; i < t3res.PopTail().Size - item.Size; i++)
                {
                    Console.Write(" ");
                }
                Console.WriteLine(item.Visual);
            }
            #endregion
            #region Task4
            Console.WriteLine("Task 4");
            Console.WriteLine();
            filename = "Task4.txt";
            string[] strings;
            strings = File.ReadAllLines(dir + Path.DirectorySeparatorChar + filename);
            var t4res = Task4(strings);
            Console.WriteLine("Баланс круглых скобок выполнен - " + t4res);
            #endregion
            #region Task5

            #endregion
            Console.WriteLine("Task 5");
            Console.WriteLine();
            filename = "Task5.txt";
            string[] strings2;
            strings2 = File.ReadAllLines(dir + Path.DirectorySeparatorChar + filename);
            var t5res = Task5(strings2);
            Console.WriteLine("Баланс квадратных скобок выполнен - " + t5res);
            #region Task6

            #endregion
            Console.WriteLine("Task 6");
            Console.WriteLine();
            filename = "Task6.txt";
            string[] strings3;
            strings3 = File.ReadAllLines(dir + Path.DirectorySeparatorChar + filename);
            Task6(strings3);
            Console.WriteLine();
            #region Task7

            #endregion
            Console.WriteLine("Task 7");
            Console.WriteLine();
            filename = "Task7.txt";
            string[] strings4;
            strings4 = File.ReadAllLines(dir + Path.DirectorySeparatorChar + filename);
            Task7(strings4);
            Console.WriteLine();
            #region Task8
            Console.WriteLine("Task 8");
            Console.WriteLine();
            filename = "Task8_source.txt";
            string[] strings5;
            strings5 = File.ReadAllLines(dir + Path.DirectorySeparatorChar + filename);
            Task8(strings5, dir);
            Console.WriteLine();
            #endregion
            #region Task9
            Console.WriteLine("Task 9");
            Console.WriteLine();
            filename = "Task9.txt";
            string string6;
            string6 = File.ReadAllText(dir + Path.DirectorySeparatorChar + filename);
            Console.WriteLine("Значение заданного логического выражения: " + Task9(string6));
            Console.WriteLine();
            #endregion
            #region Task10
            Console.WriteLine("Task 10");
            Console.WriteLine();
            filename = "Task10.txt";
            string string7;
            string7 = File.ReadAllText(dir + Path.DirectorySeparatorChar + filename);
            Console.WriteLine("Значение заданного алгебраического выражения: " + Task10(string7));
            Console.WriteLine();
            #endregion
            #region Task11
            Console.WriteLine("Task 11");
            Console.WriteLine();
            filename = "Task11.txt";
            string string8;
            string8 = File.ReadAllText(dir + Path.DirectorySeparatorChar + filename);
            Console.WriteLine("Введённая формула корректна: " + Task11(string8));
            Console.WriteLine();
            #endregion
            #endregion
        }