From 4c31c78b228025eb397f7213838037bd78d30ca0 Mon Sep 17 00:00:00 2001 From: K Anamithra Date: Sun, 8 Oct 2023 10:27:12 +0530 Subject: [PATCH 01/11] added implementing stack using two queues --- .../stacks/stack_using_two_queues.py | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 data_structures/stacks/stack_using_two_queues.py diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py new file mode 100644 index 000000000000..c3b54300e098 --- /dev/null +++ b/data_structures/stacks/stack_using_two_queues.py @@ -0,0 +1,53 @@ +class Stack: + def __init__(self): + self.queue1 = Queue() + self.queue2 = Queue() + + def is_empty(self): + return self.queue2.is_empty() + + def push(self, data): + self.queue1.enqueue(data) + while not self.queue2.is_empty(): + x = self.queue2.dequeue() + self.queue1.enqueue(x) + self.queue1, self.queue2 = self.queue2, self.queue1 + + def pop(self): + return self.queue2.dequeue() + + +class Queue: + def __init__(self): + self.items = [] + + def is_empty(self): + return self.items == [] + + def enqueue(self, data): + self.items.append(data) + + def dequeue(self): + return self.items.pop(0) + + +s = Stack() + +print('Menu') +print('push ') +print('pop') +print('quit') + +while True: + do = input('What would you like to do? ').split() + + operation = do[0].strip().lower() + if operation == 'push': + s.push(int(do[1])) + elif operation == 'pop': + if s.is_empty(): + print('Stack is empty.') + else: + print('Popped value: ', s.pop()) + elif operation == 'quit': + break From 3c1d8057245dc68ef16e37886dcc076b830494b8 Mon Sep 17 00:00:00 2001 From: K Anamithra Date: Sun, 8 Oct 2023 10:34:50 +0530 Subject: [PATCH 02/11] Update Stack using two queues --- .../stacks/stack_using_two_queues.py | 89 +++++++++++-------- 1 file changed, 52 insertions(+), 37 deletions(-) diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py index c3b54300e098..c24e20ebf25b 100644 --- a/data_structures/stacks/stack_using_two_queues.py +++ b/data_structures/stacks/stack_using_two_queues.py @@ -1,53 +1,68 @@ -class Stack: +class StackWithQueues: def __init__(self): - self.queue1 = Queue() - self.queue2 = Queue() + self.queue1 = [] + self.queue2 = [] - def is_empty(self): - return self.queue2.is_empty() - - def push(self, data): - self.queue1.enqueue(data) - while not self.queue2.is_empty(): - x = self.queue2.dequeue() - self.queue1.enqueue(x) - self.queue1, self.queue2 = self.queue2, self.queue1 + def push(self, element): + self.queue1.append(element) def pop(self): - return self.queue2.dequeue() + if not self.queue1: + return None + while len(self.queue1) > 1: + self.queue2.append(self.queue1.pop(0)) -class Queue: - def __init__(self): - self.items = [] + element = self.queue1.pop(0) - def is_empty(self): - return self.items == [] + self.queue1, self.queue2 = self.queue2, self.queue1 + + return element - def enqueue(self, data): - self.items.append(data) + def peek(self): + if not self.queue1: + return None - def dequeue(self): - return self.items.pop(0) + while len(self.queue1) > 1: + self.queue2.append(self.queue1.pop(0)) + element = self.queue1[0] -s = Stack() + self.queue2.append(self.queue1.pop(0)) -print('Menu') -print('push ') -print('pop') -print('quit') + self.queue1, self.queue2 = self.queue2, self.queue1 + + return element + +# Initialize the stack +stack = StackWithQueues() while True: - do = input('What would you like to do? ').split() - - operation = do[0].strip().lower() - if operation == 'push': - s.push(int(do[1])) - elif operation == 'pop': - if s.is_empty(): - print('Stack is empty.') + print("\nChoose operation:") + print("1. Push") + print("2. Pop") + print("3. Peek") + print("4. Quit") + + choice = input("Enter choice (1/2/3/4): ") + + if choice == '1': + element = input("Enter element to push: ") + stack.push(element) + print(f"{element} pushed onto the stack.") + elif choice == '2': + popped_element = stack.pop() + if popped_element is not None: + print(f"Popped element: {popped_element}") + else: + print("Stack is empty.") + elif choice == '3': + peeked_element = stack.peek() + if peeked_element is not None: + print(f"Top element: {peeked_element}") else: - print('Popped value: ', s.pop()) - elif operation == 'quit': + print("Stack is empty.") + elif choice == '4': break + else: + print("Invalid choice. Please try again.") From c86b303339bf9d217b631b4273aa4217e11de387 Mon Sep 17 00:00:00 2001 From: K Anamithra Date: Sun, 8 Oct 2023 10:38:20 +0530 Subject: [PATCH 03/11] Update stack_using_two_queues.py --- data_structures/stacks/stack_using_two_queues.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py index c24e20ebf25b..d88acf2264fa 100644 --- a/data_structures/stacks/stack_using_two_queues.py +++ b/data_structures/stacks/stack_using_two_queues.py @@ -1,3 +1,5 @@ +# for explanation refer this https://www.geeksforgeeks.org/implement-stack-using-queue/ + class StackWithQueues: def __init__(self): self.queue1 = [] @@ -34,6 +36,7 @@ def peek(self): return element + # Initialize the stack stack = StackWithQueues() From dd84d403074068ffad7baaf08d60dfa39e91863d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Oct 2023 05:17:21 +0000 Subject: [PATCH 04/11] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/stacks/stack_using_two_queues.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py index d88acf2264fa..bb61fc112ffc 100644 --- a/data_structures/stacks/stack_using_two_queues.py +++ b/data_structures/stacks/stack_using_two_queues.py @@ -1,5 +1,6 @@ # for explanation refer this https://www.geeksforgeeks.org/implement-stack-using-queue/ + class StackWithQueues: def __init__(self): self.queue1 = [] @@ -49,23 +50,23 @@ def peek(self): choice = input("Enter choice (1/2/3/4): ") - if choice == '1': + if choice == "1": element = input("Enter element to push: ") stack.push(element) print(f"{element} pushed onto the stack.") - elif choice == '2': + elif choice == "2": popped_element = stack.pop() if popped_element is not None: print(f"Popped element: {popped_element}") else: print("Stack is empty.") - elif choice == '3': + elif choice == "3": peeked_element = stack.peek() if peeked_element is not None: print(f"Top element: {peeked_element}") else: print("Stack is empty.") - elif choice == '4': + elif choice == "4": break else: print("Invalid choice. Please try again.") From 36960c063339001851bf42c53e00b83938616d6e Mon Sep 17 00:00:00 2001 From: K Anamithra Date: Sun, 8 Oct 2023 10:52:06 +0530 Subject: [PATCH 05/11] Update stack_using_two_queues.py --- .../stacks/stack_using_two_queues.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py index d88acf2264fa..42c5f601804f 100644 --- a/data_structures/stacks/stack_using_two_queues.py +++ b/data_structures/stacks/stack_using_two_queues.py @@ -36,6 +36,25 @@ def peek(self): return element + """ + >>> stack = StackWithQueues() + >>> stack.push(1) + >>> stack.push(2) + >>> stack.push(3) + >>> stack.peek() + 3 + >>> stack.pop() + 3 + >>> stack.peek() + 2 + >>> stack.pop() + 2 + >>> stack.pop() + 1 + >>> stack.peek() is None + True + """ + # Initialize the stack stack = StackWithQueues() From 93a0846b3adc0e195aa5c25efd99ffd4f5ca17c2 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 15 Oct 2023 18:23:28 +0200 Subject: [PATCH 06/11] Update stack_using_two_queues.py --- .../stacks/stack_using_two_queues.py | 123 ++++++++---------- 1 file changed, 57 insertions(+), 66 deletions(-) diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py index d1d09a5c0a57..cef5b6f11f82 100644 --- a/data_structures/stacks/stack_using_two_queues.py +++ b/data_structures/stacks/stack_using_two_queues.py @@ -1,43 +1,12 @@ -# for explanation refer this https://www.geeksforgeeks.org/implement-stack-using-queue/ +from collections import deque +from dataclasses import dataclass, field +@dataclass class StackWithQueues: - def __init__(self): - self.queue1 = [] - self.queue2 = [] - - def push(self, element): - self.queue1.append(element) - - def pop(self): - if not self.queue1: - return None - - while len(self.queue1) > 1: - self.queue2.append(self.queue1.pop(0)) - - element = self.queue1.pop(0) - - self.queue1, self.queue2 = self.queue2, self.queue1 - - return element - - def peek(self): - if not self.queue1: - return None - - while len(self.queue1) > 1: - self.queue2.append(self.queue1.pop(0)) - - element = self.queue1[0] - - self.queue2.append(self.queue1.pop(0)) - - self.queue1, self.queue2 = self.queue2, self.queue1 - - return element - """ + https://www.geeksforgeeks.org/implement-stack-using-queue/ + >>> stack = StackWithQueues() >>> stack.push(1) >>> stack.push(2) @@ -54,38 +23,60 @@ def peek(self): 1 >>> stack.peek() is None True + >>> stack.pop() + Traceback (most recent call last): + ... + IndexError: pop from an empty deque """ + main_queue: deque[int] = field(default_factory=deque) + temp_queue: deque[int] = field(default_factory=deque) + def push(self, item): + self.temp_queue.append(item) + while self.main_queue: + self.temp_queue.append(self.main_queue.popleft()) + self.main_queue, self.temp_queue = self.temp_queue, self.main_queue -# Initialize the stack -stack = StackWithQueues() - -while True: - print("\nChoose operation:") - print("1. Push") - print("2. Pop") - print("3. Peek") - print("4. Quit") - - choice = input("Enter choice (1/2/3/4): ") + def pop(self): + return self.main_queue.popleft() - if choice == "1": - element = input("Enter element to push: ") - stack.push(element) - print(f"{element} pushed onto the stack.") - elif choice == "2": - popped_element = stack.pop() - if popped_element is not None: - print(f"Popped element: {popped_element}") - else: - print("Stack is empty.") - elif choice == "3": - peeked_element = stack.peek() - if peeked_element is not None: - print(f"Top element: {peeked_element}") + def peek(self): + return self.main_queue[0] if self.main_queue else None + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + + stack = StackWithQueues() + while stack: + print("\nChoose operation:") + print("1. Push") + print("2. Pop") + print("3. Peek") + print("4. Quit") + + choice = input("Enter choice (1/2/3/4): ") + + if choice == "1": + element = input("Enter element to push: ") + stack.push(element) + print(f"{element} pushed onto the stack.") + elif choice == "2": + popped_element = stack.pop() + if popped_element is not None: + print(f"Popped element: {popped_element}") + else: + print("Stack is empty.") + elif choice == "3": + peeked_element = stack.peek() + if peeked_element is not None: + print(f"Top element: {peeked_element}") + else: + print("Stack is empty.") + elif choice == "4": + del stack + stack = None else: - print("Stack is empty.") - elif choice == "4": - break - else: - print("Invalid choice. Please try again.") + print("Invalid choice. Please try again.") From 76e6a93292c8b5f55db825b6c390114f57615d7d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 16:24:00 +0000 Subject: [PATCH 07/11] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/stacks/stack_using_two_queues.py | 1 + 1 file changed, 1 insertion(+) diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py index cef5b6f11f82..0e2733963a56 100644 --- a/data_structures/stacks/stack_using_two_queues.py +++ b/data_structures/stacks/stack_using_two_queues.py @@ -28,6 +28,7 @@ class StackWithQueues: ... IndexError: pop from an empty deque """ + main_queue: deque[int] = field(default_factory=deque) temp_queue: deque[int] = field(default_factory=deque) From 7d1ee9b8bda54f5b472898c65a354d468772dd1e Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 15 Oct 2023 18:26:21 +0200 Subject: [PATCH 08/11] Update stack_using_two_queues.py --- data_structures/stacks/stack_using_two_queues.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py index 0e2733963a56..adea73505c36 100644 --- a/data_structures/stacks/stack_using_two_queues.py +++ b/data_structures/stacks/stack_using_two_queues.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from collections import deque from dataclasses import dataclass, field @@ -28,20 +30,19 @@ class StackWithQueues: ... IndexError: pop from an empty deque """ - main_queue: deque[int] = field(default_factory=deque) temp_queue: deque[int] = field(default_factory=deque) - def push(self, item): + def push(self, item: int) -> None: self.temp_queue.append(item) while self.main_queue: self.temp_queue.append(self.main_queue.popleft()) self.main_queue, self.temp_queue = self.temp_queue, self.main_queue - def pop(self): + def pop(self) -> int: return self.main_queue.popleft() - def peek(self): + def peek(self) -> int | None: return self.main_queue[0] if self.main_queue else None From c05bf61779bc97be7a878bef1f9544ccf34104ea Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 16:26:56 +0000 Subject: [PATCH 09/11] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- data_structures/stacks/stack_using_two_queues.py | 1 + 1 file changed, 1 insertion(+) diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py index adea73505c36..f9ed39d4d025 100644 --- a/data_structures/stacks/stack_using_two_queues.py +++ b/data_structures/stacks/stack_using_two_queues.py @@ -30,6 +30,7 @@ class StackWithQueues: ... IndexError: pop from an empty deque """ + main_queue: deque[int] = field(default_factory=deque) temp_queue: deque[int] = field(default_factory=deque) From 9005ef79425780708254adf3cf8459776a996ff9 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 15 Oct 2023 18:29:11 +0200 Subject: [PATCH 10/11] Update stack_using_two_queues.py --- data_structures/stacks/stack_using_two_queues.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py index f9ed39d4d025..32531ae93234 100644 --- a/data_structures/stacks/stack_using_two_queues.py +++ b/data_structures/stacks/stack_using_two_queues.py @@ -63,7 +63,7 @@ def peek(self) -> int | None: choice = input("Enter choice (1/2/3/4): ") if choice == "1": - element = input("Enter element to push: ") + element = int(input("Enter an integer to push: ").strip()) stack.push(element) print(f"{element} pushed onto the stack.") elif choice == "2": From 063b2838ea1dc6c191abeade72f173deb21eef30 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 15 Oct 2023 18:32:07 +0200 Subject: [PATCH 11/11] Update stack_using_two_queues.py --- data_structures/stacks/stack_using_two_queues.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_structures/stacks/stack_using_two_queues.py b/data_structures/stacks/stack_using_two_queues.py index 32531ae93234..4b73246a045c 100644 --- a/data_structures/stacks/stack_using_two_queues.py +++ b/data_structures/stacks/stack_using_two_queues.py @@ -52,7 +52,7 @@ def peek(self) -> int | None: doctest.testmod() - stack = StackWithQueues() + stack: StackWithQueues | None = StackWithQueues() while stack: print("\nChoose operation:") print("1. Push")