From e0ed00f7d0946c1e92bd3e5ace8f04106d939560 Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 14 Apr 2023 14:52:45 +0300 Subject: [PATCH 1/3] =?UTF-8?q?1=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FirstKrFirstTry/FirstKrFirstTry.sln | 31 +++++++ .../FirstKrFirstTry/FirstKrFirstTry.csproj | 10 +++ FirstKrFirstTry/FirstKrFirstTry/Program.cs | 15 ++++ FirstKrFirstTry/FirstKrFirstTry/Queue.cs | 84 +++++++++++++++++++ .../TestsForQueue/TestsForQueue.cs | 64 ++++++++++++++ .../TestsForQueue/TestsForQueue.csproj | 23 +++++ FirstKrFirstTry/TestsForQueue/Usings.cs | 1 + 7 files changed, 228 insertions(+) create mode 100644 FirstKrFirstTry/FirstKrFirstTry.sln create mode 100644 FirstKrFirstTry/FirstKrFirstTry/FirstKrFirstTry.csproj create mode 100644 FirstKrFirstTry/FirstKrFirstTry/Program.cs create mode 100644 FirstKrFirstTry/FirstKrFirstTry/Queue.cs create mode 100644 FirstKrFirstTry/TestsForQueue/TestsForQueue.cs create mode 100644 FirstKrFirstTry/TestsForQueue/TestsForQueue.csproj create mode 100644 FirstKrFirstTry/TestsForQueue/Usings.cs 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/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..e32090d --- /dev/null +++ b/FirstKrFirstTry/FirstKrFirstTry/Program.cs @@ -0,0 +1,15 @@ +namespace PriorityQueue; + +public class Program +{ + public static void Main() + { + Queue root = new Queue(); + root.Enqueue(1, 2); + root.Enqueue(2, 3); + root.Enqueue(3, 4); + root.Enqueue(4, 4); + root.Enqueue(5, 4); + root.Enqueue(6, 4); + } +} \ No newline at end of file diff --git a/FirstKrFirstTry/FirstKrFirstTry/Queue.cs b/FirstKrFirstTry/FirstKrFirstTry/Queue.cs new file mode 100644 index 0000000..4476907 --- /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 NullReferenceException(); + } + 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..8b2383c --- /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 From 83ba31eaaba283e241cef7f748972de61c2daf50 Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 14 Apr 2023 14:54:45 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=9D=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FirstKrFirstTry/FirstKrFirstTry/Program.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/FirstKrFirstTry/FirstKrFirstTry/Program.cs b/FirstKrFirstTry/FirstKrFirstTry/Program.cs index e32090d..746f853 100644 --- a/FirstKrFirstTry/FirstKrFirstTry/Program.cs +++ b/FirstKrFirstTry/FirstKrFirstTry/Program.cs @@ -4,12 +4,6 @@ public class Program { public static void Main() { - Queue root = new Queue(); - root.Enqueue(1, 2); - root.Enqueue(2, 3); - root.Enqueue(3, 4); - root.Enqueue(4, 4); - root.Enqueue(5, 4); - root.Enqueue(6, 4); + } } \ No newline at end of file From a7566bfe2e30bb1e0974a4d3c1b942ca882b116e Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 14 Apr 2023 15:02:50 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BE=D0=B1=D1=81=D1=82=D0=B2=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20exception?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FirstKrFirstTry/FirstKrFirstTry/EmtpyQueueException.cs | 6 ++++++ FirstKrFirstTry/FirstKrFirstTry/Queue.cs | 2 +- FirstKrFirstTry/TestsForQueue/TestsForQueue.cs | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 FirstKrFirstTry/FirstKrFirstTry/EmtpyQueueException.cs 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/Queue.cs b/FirstKrFirstTry/FirstKrFirstTry/Queue.cs index 4476907..72abc3e 100644 --- a/FirstKrFirstTry/FirstKrFirstTry/Queue.cs +++ b/FirstKrFirstTry/FirstKrFirstTry/Queue.cs @@ -49,7 +49,7 @@ public int Dequeue() { if (IsEmpty()) { - throw new NullReferenceException(); + throw new EmtpyQueueException(); } var walker = Head.Next; var data = Head.Element; diff --git a/FirstKrFirstTry/TestsForQueue/TestsForQueue.cs b/FirstKrFirstTry/TestsForQueue/TestsForQueue.cs index 8b2383c..244afe6 100644 --- a/FirstKrFirstTry/TestsForQueue/TestsForQueue.cs +++ b/FirstKrFirstTry/TestsForQueue/TestsForQueue.cs @@ -21,7 +21,7 @@ public void QueueShouldBeEmptyWhenCreated(Queue queue) [TestCaseSource(nameof(QueueForTest))] public void QueueShouldThrowExceptionWhenDeletingFromAnEmptyQueue(Queue queue) { - Assert.Throws(() => queue.Dequeue()); + Assert.Throws(() => queue.Dequeue()); } [TestCaseSource(nameof(QueueForTest))]