diff --git a/FirstKrFirstTry/FirstKrFirstTry.sln b/FirstKrFirstTry/FirstKrFirstTry.sln new file mode 100644 index 0000000..a0dc0c2 --- /dev/null +++ b/FirstKrFirstTry/FirstKrFirstTry.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33403.182 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FirstKrFirstTry", "FirstKrFirstTry\FirstKrFirstTry.csproj", "{A3FCBF78-047E-4041-8702-06D2A789B8B3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsForQueue", "TestsForQueue\TestsForQueue.csproj", "{7E21A81B-A989-4A58-912F-B3ADA4467362}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A3FCBF78-047E-4041-8702-06D2A789B8B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3FCBF78-047E-4041-8702-06D2A789B8B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3FCBF78-047E-4041-8702-06D2A789B8B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3FCBF78-047E-4041-8702-06D2A789B8B3}.Release|Any CPU.Build.0 = Release|Any CPU + {7E21A81B-A989-4A58-912F-B3ADA4467362}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E21A81B-A989-4A58-912F-B3ADA4467362}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E21A81B-A989-4A58-912F-B3ADA4467362}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E21A81B-A989-4A58-912F-B3ADA4467362}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0DA28CAF-6796-472A-AF42-4830E4DF9DF0} + EndGlobalSection +EndGlobal diff --git a/FirstKrFirstTry/FirstKrFirstTry/EmtpyQueueException.cs b/FirstKrFirstTry/FirstKrFirstTry/EmtpyQueueException.cs new file mode 100644 index 0000000..a902c48 --- /dev/null +++ b/FirstKrFirstTry/FirstKrFirstTry/EmtpyQueueException.cs @@ -0,0 +1,6 @@ +namespace PriorityQueue; + +/// +/// An exception related to an empty queue +/// +public class EmtpyQueueException : Exception {} \ No newline at end of file diff --git a/FirstKrFirstTry/FirstKrFirstTry/FirstKrFirstTry.csproj b/FirstKrFirstTry/FirstKrFirstTry/FirstKrFirstTry.csproj new file mode 100644 index 0000000..f02677b --- /dev/null +++ b/FirstKrFirstTry/FirstKrFirstTry/FirstKrFirstTry.csproj @@ -0,0 +1,10 @@ + + + + Exe + net7.0 + enable + enable + + + diff --git a/FirstKrFirstTry/FirstKrFirstTry/Program.cs b/FirstKrFirstTry/FirstKrFirstTry/Program.cs new file mode 100644 index 0000000..746f853 --- /dev/null +++ b/FirstKrFirstTry/FirstKrFirstTry/Program.cs @@ -0,0 +1,9 @@ +namespace PriorityQueue; + +public class Program +{ + public static void Main() + { + + } +} \ No newline at end of file diff --git a/FirstKrFirstTry/FirstKrFirstTry/Queue.cs b/FirstKrFirstTry/FirstKrFirstTry/Queue.cs new file mode 100644 index 0000000..72abc3e --- /dev/null +++ b/FirstKrFirstTry/FirstKrFirstTry/Queue.cs @@ -0,0 +1,84 @@ +namespace PriorityQueue; + +/// +/// Queue with priority +/// +public class Queue +{ + private QueueElement? Head; + + /// + /// Add element in queue by priority + /// + /// Adding element + public void Enqueue(int element, int priority) + { + + if (IsEmpty()) + { + Head = new QueueElement(element, priority); + return; + } + var item = new QueueElement(element, priority); + if (Head.Priority < priority) + { + item.Next = Head; + Head = item; + } + var walker = Head; + while (walker.Next != null) + { + if (walker.Next.Priority < priority) + { + var data = walker.Next; + walker.Next = item; + item.Next = data; + return; + } + walker = walker.Next; + } + walker.Next = item; + } + + /// + /// Deleting first element with the highest priority + /// + /// Element with the highest priority + /// Exception if queue empty + public int Dequeue() + { + if (IsEmpty()) + { + throw new EmtpyQueueException(); + } + var walker = Head.Next; + var data = Head.Element; + Head = walker; + return data; + } + + /// + /// Checking if queue is null + /// + /// Returns true if queue null + public bool IsEmpty() + { + return Head == null; + } + + private class QueueElement + { + public QueueElement(int element, int priority){ + Element = element; + Priority = priority; + } + + + public int Element { get; set; } + + public QueueElement Next{ get; set; } + + public int Priority { get; set; } + + } +} diff --git a/FirstKrFirstTry/TestsForQueue/TestsForQueue.cs b/FirstKrFirstTry/TestsForQueue/TestsForQueue.cs new file mode 100644 index 0000000..244afe6 --- /dev/null +++ b/FirstKrFirstTry/TestsForQueue/TestsForQueue.cs @@ -0,0 +1,64 @@ +namespace TestsForQueue; + +using PriorityQueue; + +public class Tests +{ + Queue queue; + + [SetUp] + public void Setup() + { + queue = new Queue(); + } + + [TestCaseSource(nameof(QueueForTest))] + public void QueueShouldBeEmptyWhenCreated(Queue queue) + { + Assert.True(queue.IsEmpty()); + } + + [TestCaseSource(nameof(QueueForTest))] + public void QueueShouldThrowExceptionWhenDeletingFromAnEmptyQueue(Queue queue) + { + Assert.Throws(() => queue.Dequeue()); + } + + [TestCaseSource(nameof(QueueForTest))] + public void QueueShouldNotBeEmptyWhenAddedSomething(Queue queue) + { + queue.Enqueue(12, 1); + Assert.False(queue.IsEmpty()); + } + + [TestCaseSource(nameof(QueueForTest))] + public void QueueShouldReturnValueWhenAddedSomething(Queue queue) + { + queue.Enqueue(12, 1); + Assert.True(queue.Dequeue() == 12); + } + + [TestCaseSource(nameof(QueueForTest))] + public void QueueShouldReturnValueWithTheHighestPriorityWhenAddedSomething(Queue queue) + { + queue.Enqueue(11, 1); + queue.Enqueue(16, 2); + queue.Enqueue(12, 1); + Assert.True(queue.Dequeue() == 16); + } + + [TestCaseSource(nameof(QueueForTest))] + public void QueueShouldReturnFirstValueWhenPriorityTheSame(Queue queue) + { + queue.Enqueue(15, 1); + queue.Enqueue(13, 2); + queue.Enqueue(14, 2); + Assert.True(queue.Dequeue() == 13); + } + + private static IEnumerable QueueForTest + => new TestCaseData[] + { + new TestCaseData(new Queue()), + }; +} \ No newline at end of file diff --git a/FirstKrFirstTry/TestsForQueue/TestsForQueue.csproj b/FirstKrFirstTry/TestsForQueue/TestsForQueue.csproj new file mode 100644 index 0000000..093cf8f --- /dev/null +++ b/FirstKrFirstTry/TestsForQueue/TestsForQueue.csproj @@ -0,0 +1,23 @@ + + + + net7.0 + enable + enable + + false + + + + + + + + + + + + + + + diff --git a/FirstKrFirstTry/TestsForQueue/Usings.cs b/FirstKrFirstTry/TestsForQueue/Usings.cs new file mode 100644 index 0000000..cefced4 --- /dev/null +++ b/FirstKrFirstTry/TestsForQueue/Usings.cs @@ -0,0 +1 @@ +global using NUnit.Framework; \ No newline at end of file