Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace Rub4
- {
- ///<summary>
- ///Кольцевой буфер
- ///</summary>
- ///<typeparam name="T">Тип данных в буфере</typeparam>
- public interface IRingBuffer<T>
- {
- ///<summary>
- ///Размер буфера
- ///</summary>
- int Size { get; }
- ///<summary>
- ///Количество элементов, которое можно поместить в буфер
- ///</summary>
- int FreeSpace { get; }
- ///<summary>
- ///Попытаться поместить элемент в буфер
- ///</summary>
- ///<param name="item">Новый элемент</param>
- ///<returns>true, если удалось поместить элемент, иначе - false</returns>
- bool TryPut(T item);
- ///<summary>
- ///Попытаться получить элемент из буфера
- ///</summary>
- ///<param name="item">Полученный элемент</param>
- ///<returns>true, если удалось получить элемент, иначе - false</returns>
- bool TryGet(out T item);
- }
- public class RingBuffer<T> : IRingBuffer<T>
- {
- private int size;
- public int freeSpace;
- private int first;
- private int last;
- public int Size
- {
- get
- {
- return size;
- }
- }
- public int FreeSpace
- {
- get
- {
- return freeSpace;
- }
- }
- private T[] buffer;
- public RingBuffer()
- {
- buffer = new T[100];
- this.size = 100;
- this.freeSpace = 100;
- first = size / 2;
- last = first;
- }
- public RingBuffer(int size)
- {
- buffer = new T[size];
- this.size = size;
- this.freeSpace = size;
- first = size / 2;
- last = first;
- }
- public bool TryPut(T item)
- {
- if (freeSpace > 0)
- {
- if (last < size)
- {
- buffer[last] = item;
- last++;
- }
- else
- {
- buffer[size - last] = item;
- last = size - last;
- }
- freeSpace--;
- return true;
- }
- else
- {
- return false;
- }
- }
- public bool TryGet(out T item)
- {
- try
- {
- item = buffer[last-1];
- return true;
- }
- catch
- {
- item = buffer[0]; //костыль. Мы обязательно должны вернуть какое-то значение, но какое если произошла ошибка?
- return false;
- }
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- RingBuffer<int> test = new RingBuffer<int>(200);
- for (int i = 0; i < 201; i++)
- {
- if (test.TryPut(i))
- {
- if (i % 2 == 0)
- {
- int t;
- test.TryGet(out t);
- Console.WriteLine(t.ToString());
- }
- }
- else
- {
- Console.WriteLine("Нет места!");
- }
- }
- Console.ReadLine();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement