Коллекции
Рассмотрим несколько примеров использования стека.
Пример 1.Для заданного значения n запишем в стек все числа от 1 до n, а затем извлечем из стека:
using System; using System.Collections; namespace ConsoleApplication { class Program { public static void Main() { Console.Write("n= "); int n=int.Parse(Console.ReadLine()); Stack intStack = new Stack(); for (int i = 1; i <= n; i++) intStack.Push(i); Console.WriteLine("Размерность стека " + intStack.Count); Console.WriteLine("Верхний элемент стека = " + intStack.Peek()); Console.WriteLine("Размерность стека " + intStack.Count); Console.Write("Содержимое стека = "); while (intStack.Count != 0) Console.Write("{0} ", intStack.Pop()); Console.WriteLine("\nНовая размерность стека " + intStack.Count); } } }
Пример 2.В текстовом файле содержится математическое выражение. Проверить баланс круглых скобок в данном выражении.
using System; using System.Collections; using System.IO; namespace MyProgram { class Program { public static void Main() { StreamReader fileIn=new StreamReader("t.txt",); string line=fileIn.ReadToEnd(); fileIn.Close(); Stack skobki=new Stack(); bool flag=true; //проверяем баланс скобок for ( int i=0; i<line.Length;i++) { //если текущий символ открывающаяся скобка, то помещаем ее в стек if (line[i] == '(') skobki.Push(i); else if (line[i] == ')') //если текущий символ закрывающаяся скобка, то { //если стек пустой, то для закрывающейся скобки не хватает парной открывающейся if (skobki.Count == 0) { flag = false; Console.WriteLine("Возможно в позиции " + i + "лишняя ) скобка"); } else skobki.Pop(); //иначе извлекаем парную скобку } } //если после просмотра строки стек оказался пустым, то скобки сбалансированы if (skobki.Count == 0) { if (flag)Console.WriteLine("скобки сбалансированы"); } else //иначе баланс скобок нарушен { Console.Write("Возможно лишняя ( скобка в позиции:"); while (skobki.Count != 0) { Console.Write("{0} ", (int)skobki.Pop()); } Console.WriteLine(); } } } } ________t.txt_________ (1+2)-4*(a-3)/(2-7+6)
Класс Queue
АТД очередь - это частный случай однонаправленного списка, добавление элементов в который выполняется в один конец (хвост), а выборка производится с другого конца (головы). Другие операции с очередью не определены. При выборке элемент исключается из очереди. Говорят, что очередь реализует принцип обслуживания FIFO (fist in - fist out, первым пришел - первым вышел). Очередь проще всего представить в виде узкой трубы, в один конец которой бросают мячи, а с другого конца которой они вылетают. Понятно, что мяч, который был брошен в трубу первым, первым и вылетит с другого конца.
В С# реализацию АТД очередь представляет класс Queue, который также как и стек реализует интерфейсы ICollection, IEnumerable и ICloneable. Queue - это динамическая коллекция, размер которой изменяется. При необходимости увеличение вместимости очереди происходит с коэффициентом роста по умолчанию равным 2.0.
В классе Queue определены следующие конструкторы:
public Queue(); //создает пустую очередь, начальная вместимость которой равна 32 public Queue (int capacity); // создает пустую очередь, начальная вместимость которой равна capacity //создает пустую очередь, начальная вместимость которой равна capacity, и коэффициент роста //устанавливается параметром n public Queue (int capacity, float n); //создает очередь, которая содержит элементы коллекции, заданной параметром с, и аналогичной //вместимостью public Queue (ICollection c);
Кроме методов, определенных в интерфейсах, реализуемых классом Queue, в этом классе определены собственные методы:
Рассмотрим несколько примеров использования очереди.
Пример 1.Для заданного значения n запишем в очередь все числа от 1 до n, а затем извлечем их из очереди:
using System; using System.Collections; namespace MyProgram { class Program { public static void Main() { Console.Write("n= "); int n=int.Parse(Console.ReadLine()); Queue intQ = new Queue(); for (int i = 1; i <= n; i++) intQ.Enqueue(i); Console.WriteLine("Размерность очереди " + intQ.Count); Console.WriteLine("Верхний элемент очереди = " + intQ.Peek()); Console.WriteLine("Размерность очереди " + intQ.Count); Console.Write("Содержимое очереди = " ); while (intQ.Count!=0) Console.Write("{0} ", intQ.Dequeue()); Console.WriteLine("\nНовая размерность очереди " + intQ.Count); } } }
Пример 2.В текстовом файле записана информация о людях (фамилия, имя, отчество, возраст, вес через пробел). Вывести на экран вначале информацию о людях младше 40 лет, а затем информацию о всех остальных.
using System; using System.Collections; using System.IO; using System.Text; namespace MyProgram { class Program { public struct one //структура для хранения данных об одном человеке { public string f; public string i; public string o; public int age; public float massa; } public static void Main() { StreamReader fileIn = new StreamReader("t.txt",Encoding.GetEncoding(1251)); string line; Queue people = new Queue(); one a; Console.WriteLine("ВОЗРАСТ МЕНЕЕ 40 ЛЕТ"); while ((line = fileIn.ReadLine()) != null) //читаем до конца файла { string [] temp = line.Split(' '); //разбиваем строку на составные элементы //заполняем структуру a.f = temp[0]; a.i = temp[1]; a.o = temp[2]; a.age = int.Parse(temp[3]); a.massa = float.Parse(temp[4]); // если возраст меньше 40 лет, то выводим данные на экран, иначе помещаем их в //очередь для временного хранения if (a.age<40) Console.WriteLine(a.f + "\t"+ a.i + "\t"+ a.o + "\t"+a.age + "\t" + a.massa); else people.Enqueue(a); } fileIn.Close(); Console.WriteLine("ВОЗРАСТ 40 ЛЕТ И СТАРШЕ"); while (people.Count != 0) //извлекаем из очереди данные { a = (one)people.Dequeue(); Console.WriteLine(a.f + "\t"+ a.i + "\t"+ a.o + "\t"+a.age + "\t" + a.massa); } } } }_______________t.txt__________________ Иванов Сергей Николаевич 21 64 Петров Игорь Юрьевич 45 88 Семёнов Михаил Алексеевич 20 70 Пиманов Александр Дмитриевич 53 101
Класс ArrayList
В С# стандартные массивы имеют фиксированную длину, которая не может измениться во время выполнения программы. Класс ArrayList предназначен для поддержки динамических массивов, которые при необходимости могут увеличиваться или сокращаться.
Объект класса ArrayList представляет собой массив переменной длины, элементами которого являются объектные ссылки. Любой объект класса ArrayList создается с некоторым начальным размером. При превышении этого размера коллекция автоматически удваивается. В случае удаления объектов массив можно сократить.
Класс ArrayList реализует интерфейсы ICollection, IList, IEnumerable и ICloneable. В классе ArrayList определены следующие конструкторы:
//создает пустой массив с максимальной емкостью равной 16 элементам, при текущей размерности 0 public ArrayList() public ArrayList(int capacity) //создает массив с заданной емкостью capacity, при текущей размерности 0 public ArrayList(ICollection с) //строит массив, который инициализируется элементами коллекции с
Помимо методов, определенных в интерфейсах, которые реализует класс ArrayList, в нем определены и собственные методы:
Свойство Capacity позволяет узнать или установить емкость вызывающего динамического массива типа ArrayList. Емкость представляет собой количество элементов, которые можно сохранить в ArrayList -массиве без его увеличения. Если вам заранее известно, сколько элементов должно содержаться в ArrayList -массиве, то размерность массива можно установить используя свойство Capacity, съэкономив тем самым системные ресурсы. Если нужно уменьшить размер ArrayList-массива, то путем установки свойства Capacity можно сделать его меньшим. Но устанавливаемое значение не должно быть меньше значения свойства Count, иначе будет сгенерировано исключение ArgumentOutOfRangeException. Чтобы сделать емкость ArrayList -массива равной действительному количеству элементов, хранимых в нем в данный момент, установите свойство Capacity равным свойству Count. Того же эффекта можно добиться, вызвав метод TrimToSize ().