From 8a8dca52bfec26adb1cc85796ad6ec11ed8afc5b Mon Sep 17 00:00:00 2001 From: shellhub Date: Fri, 11 Sep 2020 00:25:07 +0800 Subject: [PATCH 1/4] * Added type hints * Added test * Formated code --- data_structures/stacks/stack.py | 51 +++++++++++++++++---------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/data_structures/stacks/stack.py b/data_structures/stacks/stack.py index a4bcb5beabd4..cb9bd0235eda 100644 --- a/data_structures/stacks/stack.py +++ b/data_structures/stacks/stack.py @@ -1,6 +1,3 @@ -__author__ = "Omkar Pathak" - - class Stack: """A stack is an abstract data type that serves as a collection of elements with two principal operations: push() and pop(). push() adds an @@ -11,14 +8,14 @@ class Stack: https://en.wikipedia.org/wiki/Stack_(abstract_data_type) """ - def __init__(self, limit=10): + def __init__(self, limit: int = 10): self.stack = [] self.limit = limit - def __bool__(self): + def __bool__(self) -> bool: return bool(self.stack) - def __str__(self): + def __str__(self) -> str: return str(self.stack) def push(self, data): @@ -29,21 +26,24 @@ def push(self, data): def pop(self): """ Pop an element off of the top of the stack.""" - if self.stack: - return self.stack.pop() - else: + if self.is_empty(): raise IndexError("pop from an empty stack") + return self.stack.pop() def peek(self): """ Peek at the top-most element of the stack.""" - if self.stack: - return self.stack[-1] + if self.is_empty(): + raise IndexError("peek from an empty stack") + return self.stack[-1] - def is_empty(self): + def is_empty(self) -> bool: """ Check if a stack is empty.""" return not bool(self.stack) - def size(self): + def is_full(self) -> bool: + return self.size() == self.limit + + def size(self) -> int: """ Return the size of the stack.""" return len(self.stack) @@ -57,19 +57,22 @@ class StackOverflowError(BaseException): if __name__ == "__main__": - stack = Stack() + stack = Stack(10) for i in range(10): stack.push(i) - print("Stack demonstration:\n") - print("Initial stack: " + str(stack)) - print("pop(): " + str(stack.pop())) - print("After pop(), the stack is now: " + str(stack)) - print("peek(): " + str(stack.peek())) + assert stack.is_full() + assert str(stack) == str([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) + assert stack.pop() == 9 + assert stack.peek() == 8 + stack.push(100) - print("After push(100), the stack is now: " + str(stack)) - print("is_empty(): " + str(stack.is_empty())) - print("size(): " + str(stack.size())) + assert str(stack) == str([0, 1, 2, 3, 4, 5, 6, 7, 8, 100]) + + assert not stack.is_empty() + assert stack.size() == 10 + num = 5 - if num in stack: - print(f"{num} is in stack") + assert num in stack + num = 55 + assert num not in stack From f7d98be0212b3807461836be3dd40bf5fe4b2b7f Mon Sep 17 00:00:00 2001 From: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Date: Thu, 10 Sep 2020 16:26:41 +0000 Subject: [PATCH 2/4] updating DIRECTORY.md --- DIRECTORY.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/DIRECTORY.md b/DIRECTORY.md index 70f7726d99c0..ac10afdc0ccd 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -24,6 +24,9 @@ * [Sudoku](https://github.com/TheAlgorithms/Python/blob/master/backtracking/sudoku.py) * [Sum Of Subsets](https://github.com/TheAlgorithms/Python/blob/master/backtracking/sum_of_subsets.py) +## Bit Manipulation + * [Binary Or Operator](https://github.com/TheAlgorithms/Python/blob/master/bit_manipulation/binary_or_operator.py) + ## Blockchain * [Chinese Remainder Theorem](https://github.com/TheAlgorithms/Python/blob/master/blockchain/chinese_remainder_theorem.py) * [Diophantine Equation](https://github.com/TheAlgorithms/Python/blob/master/blockchain/diophantine_equation.py) @@ -50,6 +53,7 @@ * [Deterministic Miller Rabin](https://github.com/TheAlgorithms/Python/blob/master/ciphers/deterministic_miller_rabin.py) * [Diffie](https://github.com/TheAlgorithms/Python/blob/master/ciphers/diffie.py) * [Elgamal Key Generator](https://github.com/TheAlgorithms/Python/blob/master/ciphers/elgamal_key_generator.py) + * [Enigma Machine2](https://github.com/TheAlgorithms/Python/blob/master/ciphers/enigma_machine2.py) * [Hill Cipher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/hill_cipher.py) * [Mixed Keyword Cypher](https://github.com/TheAlgorithms/Python/blob/master/ciphers/mixed_keyword_cypher.py) * [Morse Code Implementation](https://github.com/TheAlgorithms/Python/blob/master/ciphers/morse_code_implementation.py) @@ -105,6 +109,7 @@ * [Segment Tree Other](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/segment_tree_other.py) * [Treap](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/treap.py) * Disjoint Set + * [Alternate Disjoint Set](https://github.com/TheAlgorithms/Python/blob/master/data_structures/disjoint_set/alternate_disjoint_set.py) * [Disjoint Set](https://github.com/TheAlgorithms/Python/blob/master/data_structures/disjoint_set/disjoint_set.py) * Hashing * [Double Hash](https://github.com/TheAlgorithms/Python/blob/master/data_structures/hashing/double_hash.py) @@ -419,6 +424,7 @@ * [Sum Of Geometric Progression](https://github.com/TheAlgorithms/Python/blob/master/maths/sum_of_geometric_progression.py) * [Test Prime Check](https://github.com/TheAlgorithms/Python/blob/master/maths/test_prime_check.py) * [Trapezoidal Rule](https://github.com/TheAlgorithms/Python/blob/master/maths/trapezoidal_rule.py) + * [Ugly Numbers](https://github.com/TheAlgorithms/Python/blob/master/maths/ugly_numbers.py) * [Volume](https://github.com/TheAlgorithms/Python/blob/master/maths/volume.py) * [Zellers Congruence](https://github.com/TheAlgorithms/Python/blob/master/maths/zellers_congruence.py) @@ -474,6 +480,7 @@ * [Sdes](https://github.com/TheAlgorithms/Python/blob/master/other/sdes.py) * [Sierpinski Triangle](https://github.com/TheAlgorithms/Python/blob/master/other/sierpinski_triangle.py) * [Tower Of Hanoi](https://github.com/TheAlgorithms/Python/blob/master/other/tower_of_hanoi.py) + * [Triplet Sum](https://github.com/TheAlgorithms/Python/blob/master/other/triplet_sum.py) * [Two Sum](https://github.com/TheAlgorithms/Python/blob/master/other/two_sum.py) * [Word Patterns](https://github.com/TheAlgorithms/Python/blob/master/other/word_patterns.py) @@ -600,6 +607,12 @@ * [Solution42](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_42/solution42.py) * Problem 43 * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_43/sol1.py) + * Problem 44 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_44/sol1.py) + * Problem 45 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_45/sol1.py) + * Problem 46 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_46/sol1.py) * Problem 47 * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_47/sol1.py) * Problem 48 @@ -608,10 +621,14 @@ * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_52/sol1.py) * Problem 53 * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_53/sol1.py) + * Problem 55 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_55/sol1.py) * Problem 551 * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_551/sol1.py) * Problem 56 * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_56/sol1.py) + * Problem 63 + * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_63/sol1.py) * Problem 67 * [Sol1](https://github.com/TheAlgorithms/Python/blob/master/project_euler/problem_67/sol1.py) * Problem 76 @@ -673,7 +690,6 @@ * [Recursive Insertion Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/recursive_insertion_sort.py) * [Selection Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/selection_sort.py) * [Shell Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/shell_sort.py) - * [Sleep Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/sleep_sort.py) * [Stooge Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/stooge_sort.py) * [Strand Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/strand_sort.py) * [Tim Sort](https://github.com/TheAlgorithms/Python/blob/master/sorts/tim_sort.py) @@ -685,6 +701,7 @@ ## Strings * [Aho-Corasick](https://github.com/TheAlgorithms/Python/blob/master/strings/aho-corasick.py) * [Boyer Moore Search](https://github.com/TheAlgorithms/Python/blob/master/strings/boyer_moore_search.py) + * [Capitalize](https://github.com/TheAlgorithms/Python/blob/master/strings/capitalize.py) * [Check Anagrams](https://github.com/TheAlgorithms/Python/blob/master/strings/check_anagrams.py) * [Check Pangram](https://github.com/TheAlgorithms/Python/blob/master/strings/check_pangram.py) * [Is Palindrome](https://github.com/TheAlgorithms/Python/blob/master/strings/is_palindrome.py) @@ -715,6 +732,7 @@ * [Emails From Url](https://github.com/TheAlgorithms/Python/blob/master/web_programming/emails_from_url.py) * [Fetch Bbc News](https://github.com/TheAlgorithms/Python/blob/master/web_programming/fetch_bbc_news.py) * [Fetch Github Info](https://github.com/TheAlgorithms/Python/blob/master/web_programming/fetch_github_info.py) + * [Fetch Jobs](https://github.com/TheAlgorithms/Python/blob/master/web_programming/fetch_jobs.py) * [Get Imdb Top 250 Movies Csv](https://github.com/TheAlgorithms/Python/blob/master/web_programming/get_imdb_top_250_movies_csv.py) * [Get Imdbtop](https://github.com/TheAlgorithms/Python/blob/master/web_programming/get_imdbtop.py) * [Slack Message](https://github.com/TheAlgorithms/Python/blob/master/web_programming/slack_message.py) From d686f88791a9f034b73a15578e334a73672d9f24 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 13 Sep 2020 07:40:56 +0200 Subject: [PATCH 3/4] Update stack.py --- data_structures/stacks/stack.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/data_structures/stacks/stack.py b/data_structures/stacks/stack.py index cb9bd0235eda..268eb5330e8f 100644 --- a/data_structures/stacks/stack.py +++ b/data_structures/stacks/stack.py @@ -1,3 +1,7 @@ +class StackOverflowError(BaseException): + pass + + class Stack: """A stack is an abstract data type that serves as a collection of elements with two principal operations: push() and pop(). push() adds an @@ -52,27 +56,28 @@ def __contains__(self, item) -> bool: return item in self.stack -class StackOverflowError(BaseException): - pass - - if __name__ == "__main__": stack = Stack(10) + assert bool(stack) is False + assert stack.is_empty() is True + assert stack.is_full() is False + assert str(stack) == "[]" for i in range(10): + assert stack.size() == i stack.push(i) - assert stack.is_full() - assert str(stack) == str([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) + assert bool(stack) is True + assert stack.is_empty() is False + assert stack.is_full() is True + assert str(stack) == str(list(range(10))) assert stack.pop() == 9 assert stack.peek() == 8 stack.push(100) assert str(stack) == str([0, 1, 2, 3, 4, 5, 6, 7, 8, 100]) - assert not stack.is_empty() + assert stack.is_empty() is False assert stack.size() == 10 - num = 5 - assert num in stack - num = 55 - assert num not in stack + assert 5 in stack + assert 55 not in stack From c8b26795a069cac2c3e00ef2dc567620abb39d87 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 13 Sep 2020 13:48:00 +0200 Subject: [PATCH 4/4] Test error conditions for pop, peek, and --- data_structures/stacks/stack.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/data_structures/stacks/stack.py b/data_structures/stacks/stack.py index 268eb5330e8f..840cde099d38 100644 --- a/data_structures/stacks/stack.py +++ b/data_structures/stacks/stack.py @@ -8,7 +8,6 @@ class Stack: element to the top of the stack, and pop() removes an element from the top of a stack. The order in which elements come off of a stack are Last In, First Out (LIFO). - https://en.wikipedia.org/wiki/Stack_(abstract_data_type) """ @@ -30,14 +29,10 @@ def push(self, data): def pop(self): """ Pop an element off of the top of the stack.""" - if self.is_empty(): - raise IndexError("pop from an empty stack") return self.stack.pop() def peek(self): """ Peek at the top-most element of the stack.""" - if self.is_empty(): - raise IndexError("peek from an empty stack") return self.stack[-1] def is_empty(self) -> bool: @@ -56,12 +51,28 @@ def __contains__(self, item) -> bool: return item in self.stack -if __name__ == "__main__": +def test_stack() -> None: + """ + >>> test_stack() + """ stack = Stack(10) assert bool(stack) is False assert stack.is_empty() is True assert stack.is_full() is False assert str(stack) == "[]" + + try: + _ = stack.pop() + assert False # This should not happen + except IndexError: + assert True # This should happen + + try: + _ = stack.peek() + assert False # This should not happen + except IndexError: + assert True # This should happen + for i in range(10): assert stack.size() == i stack.push(i) @@ -76,8 +87,18 @@ def __contains__(self, item) -> bool: stack.push(100) assert str(stack) == str([0, 1, 2, 3, 4, 5, 6, 7, 8, 100]) + try: + stack.push(200) + assert False # This should not happen + except StackOverflowError: + assert True # This should happen + assert stack.is_empty() is False assert stack.size() == 10 assert 5 in stack assert 55 not in stack + + +if __name__ == "__main__": + test_stack()