Tutorial 2

This commit is contained in:
Marcus Vinicius de Carvalho 2025-02-17 15:03:12 +08:00
parent 60ad042acc
commit bc6f105faa
6 changed files with 836 additions and 0 deletions

View File

@ -0,0 +1,144 @@
class ListNode:
def __init__(self, item=None):
self.item = item
self.next = None
class LinkedList:
def __init__(self):
self.size = 0
self.head = None
def print_list(self):
cur = self.head
if cur is None:
print("Empty")
return
while cur is not None:
print(cur.item, end=" ")
cur = cur.next
print()
def find_node(self, index):
if index < 0 or index >= self.size:
return None
temp = self.head
for _ in range(index):
temp = temp.next
return temp
def insert_node(self, index, value):
if index < 0 or index > self.size:
return -1
new_node = ListNode(value)
if index == 0:
new_node.next = self.head
self.head = new_node
self.size += 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None:
return -1
new_node.next = prev_node.next
prev_node.next = new_node
self.size += 1
return 0
def remove_node(self, index):
if self.head is None:
return -1
if index < 0 or index >= self.size:
return -1
if index == 0:
self.head = self.head.next
self.size -= 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None or prev_node.next is None:
return -1
prev_node.next = prev_node.next.next
self.size -= 1
return 0
def remove_all_items(self):
self.head = None
self.size = 0
class Stack:
def __init__(self):
self.ll = LinkedList()
def push(self, item):
self.ll.insert_node(0, item)
def pop(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def peek(self):
if self.is_empty():
return None
return self.ll.head.item
def is_empty(self):
return self.ll.size == 0
class Queue:
def __init__(self):
self.ll = LinkedList()
def enqueue(self, item):
self.ll.insert_node(self.ll.size, item)
def dequeue(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def is_empty(self):
return self.ll.size == 0
def reverse_stack(stack):
if stack.is_empty():
return
queue = Queue()
while not stack.is_empty():
queue.enqueue(stack.pop())
while not queue.is_empty():
stack.push(queue.dequeue())
del queue # Optional, as Python will automatically free this memory after a while
# Main function
def main():
stack = Stack()
while True:
print("1: Insert an integer into the stack;")
print("2: Reverse the stack;")
print("0: Quit;")
choice = int(input("Please input your choice(1/2/0): "))
if choice == 1:
value = int(input("Input an integer that you want to insert into the stack: "))
stack.push(value)
print("The resulting stack is: ", end="")
stack.ll.print_list()
elif choice == 2:
reverse_stack(stack)
print("The resulting stack after reversing its elements is: ", end="")
stack.ll.print_list()
stack.ll.remove_all_items()
elif choice == 0:
stack.ll.remove_all_items()
break
else:
print("Choice unknown.")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,147 @@
class ListNode:
def __init__(self, item=None):
self.item = item
self.next = None
class LinkedList:
def __init__(self):
self.size = 0
self.head = None
def print_list(self):
cur = self.head
if cur is None:
print("Empty")
return
while cur is not None:
print(cur.item, end=" ")
cur = cur.next
print()
def find_node(self, index):
if index < 0 or index >= self.size:
return None
temp = self.head
for _ in range(index):
temp = temp.next
return temp
def insert_node(self, index, value):
if index < 0 or index > self.size:
return -1
new_node = ListNode(value)
if index == 0:
new_node.next = self.head
self.head = new_node
self.size += 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None:
return -1
new_node.next = prev_node.next
prev_node.next = new_node
self.size += 1
return 0
def remove_node(self, index):
if self.head is None:
return -1
if index < 0 or index >= self.size:
return -1
if index == 0:
self.head = self.head.next
self.size -= 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None or prev_node.next is None:
return -1
prev_node.next = prev_node.next.next
self.size -= 1
return 0
def remove_all_items(self):
self.head = None
self.size = 0
class Stack:
def __init__(self):
self.ll = LinkedList()
def push(self, item):
self.ll.insert_node(0, item)
def pop(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def peek(self):
if self.is_empty():
return None
return self.ll.head.item
def is_empty(self):
return self.ll.size == 0
class Queue:
def __init__(self):
self.ll = LinkedList()
def enqueue(self, item):
self.ll.insert_node(self.ll.size, item)
def dequeue(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def is_empty(self):
return self.ll.size == 0
def reverse_first_k_items(queue, k):
if k <= 0 or queue.is_empty() or k > queue.ll.size:
return
stack = Stack()
for _ in range(k):
stack.push(queue.dequeue())
while not stack.is_empty():
queue.enqueue(stack.pop())
for _ in range(queue.ll.size - k):
queue.enqueue(queue.dequeue())
del stack # Optional, as Python will automatically free this memory after a while
def main():
queue = Queue()
while True:
print("1: Insert an integer into the queue;")
print("2: Reverse the elements of the queue until the given number;")
print("0: Quit;")
choice = int(input("Please input your choice(1/2/0): "))
if choice == 1:
value = int(input("Input an integer that you want to insert into the queue: "))
queue.enqueue(value)
print("The resulting queue is: ", end="")
queue.ll.print_list()
elif choice == 2:
value = int(input("Enter an integer to reverse the queue until that number: "))
reverse_first_k_items(queue, value)
print(f"The resulting queue after reversing first {value} elements is: ", end="")
queue.ll.print_list()
queue.ll.remove_all_items()
elif choice == 0:
queue.ll.remove_all_items()
break
else:
print("Choice unknown;")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,146 @@
class ListNode:
def __init__(self, item=None):
self.item = item
self.next = None
class LinkedList:
def __init__(self):
self.size = 0
self.head = None
def print_list(self):
cur = self.head
if cur is None:
print("Empty")
return
while cur is not None:
print(cur.item, end=" ")
cur = cur.next
print()
def find_node(self, index):
if index < 0 or index >= self.size:
return None
temp = self.head
for _ in range(index):
temp = temp.next
return temp
def insert_node(self, index, value):
if index < 0 or index > self.size:
return -1
new_node = ListNode(value)
if index == 0:
new_node.next = self.head
self.head = new_node
self.size += 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None:
return -1
new_node.next = prev_node.next
prev_node.next = new_node
self.size += 1
return 0
def remove_node(self, index):
if self.head is None:
return -1
if index < 0 or index >= self.size:
return -1
if index == 0:
self.head = self.head.next
self.size -= 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None or prev_node.next is None:
return -1
prev_node.next = prev_node.next.next
self.size -= 1
return 0
def remove_all_items(self):
self.head = None
self.size = 0
class Stack:
def __init__(self):
self.ll = LinkedList()
def push(self, item):
self.ll.insert_node(0, item)
def pop(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def peek(self):
if self.is_empty():
return None
return self.ll.head.item
def is_empty(self):
return self.ll.size == 0
class Queue:
def __init__(self):
self.ll = LinkedList()
def enqueue(self, item):
self.ll.insert_node(self.ll.size, item)
def dequeue(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def is_empty(self):
return self.ll.size == 0
def sort_stack(stack):
if stack.is_empty():
return
temp_stack = Stack()
while not stack.is_empty():
temp = stack.pop()
while not temp_stack.is_empty() and temp_stack.peek() > temp:
stack.push(temp_stack.pop())
temp_stack.push(temp)
while not temp_stack.is_empty():
stack.push(temp_stack.pop())
del temp_stack # Optional, as Python will automatically free this memory after a while
def main():
stack = Stack()
while True:
print("1: Insert an integer into the stack;")
print("2: Sort the stack in ascending order;")
print("0: Quit;")
choice = int(input("Please input your choice(1/2/0): "))
if choice == 1:
value = int(input("Input an integer that you want to insert into the stack: "))
stack.push(value)
print("The resulting stack is: ", end="")
stack.ll.print_list()
elif choice == 2:
sort_stack(stack)
print("The resulting stack after sorting it in ascending order is: ", end="")
stack.ll.print_list()
stack.ll.remove_all_items()
elif choice == 0:
stack.ll.remove_all_items()
break
else:
print("Choice unknown;")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,133 @@
class ListNode:
def __init__(self, item=None):
self.item = item
self.next = None
class LinkedList:
def __init__(self):
self.size = 0
self.head = None
def print_list(self):
cur = self.head
if cur is None:
print("Empty")
return
while cur is not None:
print(cur.item, end=" ")
cur = cur.next
print()
def find_node(self, index):
if index < 0 or index >= self.size:
return None
temp = self.head
for _ in range(index):
temp = temp.next
return temp
def insert_node(self, index, value):
if index < 0 or index > self.size:
return -1
new_node = ListNode(value)
if index == 0:
new_node.next = self.head
self.head = new_node
self.size += 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None:
return -1
new_node.next = prev_node.next
prev_node.next = new_node
self.size += 1
return 0
def remove_node(self, index):
if self.head is None:
return -1
if index < 0 or index >= self.size:
return -1
if index == 0:
self.head = self.head.next
self.size -= 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None or prev_node.next is None:
return -1
prev_node.next = prev_node.next.next
self.size -= 1
return 0
def remove_all_items(self):
self.head = None
self.size = 0
class Stack:
def __init__(self):
self.ll = LinkedList()
def push(self, item):
self.ll.insert_node(0, item)
def pop(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def peek(self):
if self.is_empty():
return None
return self.ll.head.item
def is_empty(self):
return self.ll.size == 0
class Queue:
def __init__(self):
self.ll = LinkedList()
def enqueue(self, item):
self.ll.insert_node(self.ll.size, item)
def dequeue(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def is_empty(self):
return self.ll.size == 0
def reverse_stack(stack):
raise NotImplementedError
# Main function
def main():
stack = Stack()
while True:
print("1: Insert an integer into the stack;")
print("2: Reverse the stack;")
print("0: Quit;")
choice = int(input("Please input your choice(1/2/0): "))
if choice == 1:
value = int(input("Input an integer that you want to insert into the stack: "))
stack.push(value)
print("The resulting stack is: ", end="")
stack.ll.print_list()
elif choice == 2:
reverse_stack(stack)
print("The resulting stack after reversing its elements is: ", end="")
stack.ll.print_list()
stack.ll.remove_all_items()
elif choice == 0:
stack.ll.remove_all_items()
break
else:
print("Choice unknown.")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,133 @@
class ListNode:
def __init__(self, item=None):
self.item = item
self.next = None
class LinkedList:
def __init__(self):
self.size = 0
self.head = None
def print_list(self):
cur = self.head
if cur is None:
print("Empty")
return
while cur is not None:
print(cur.item, end=" ")
cur = cur.next
print()
def find_node(self, index):
if index < 0 or index >= self.size:
return None
temp = self.head
for _ in range(index):
temp = temp.next
return temp
def insert_node(self, index, value):
if index < 0 or index > self.size:
return -1
new_node = ListNode(value)
if index == 0:
new_node.next = self.head
self.head = new_node
self.size += 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None:
return -1
new_node.next = prev_node.next
prev_node.next = new_node
self.size += 1
return 0
def remove_node(self, index):
if self.head is None:
return -1
if index < 0 or index >= self.size:
return -1
if index == 0:
self.head = self.head.next
self.size -= 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None or prev_node.next is None:
return -1
prev_node.next = prev_node.next.next
self.size -= 1
return 0
def remove_all_items(self):
self.head = None
self.size = 0
class Stack:
def __init__(self):
self.ll = LinkedList()
def push(self, item):
self.ll.insert_node(0, item)
def pop(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def peek(self):
if self.is_empty():
return None
return self.ll.head.item
def is_empty(self):
return self.ll.size == 0
class Queue:
def __init__(self):
self.ll = LinkedList()
def enqueue(self, item):
self.ll.insert_node(self.ll.size, item)
def dequeue(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def is_empty(self):
return self.ll.size == 0
def reverse_first_k_items(queue, k):
raise NotImplementedError
def main():
queue = Queue()
while True:
print("1: Insert an integer into the queue;")
print("2: Reverse the elements of the queue until the given number;")
print("0: Quit;")
choice = int(input("Please input your choice(1/2/0): "))
if choice == 1:
value = int(input("Input an integer that you want to insert into the queue: "))
queue.enqueue(value)
print("The resulting queue is: ", end="")
queue.ll.print_list()
elif choice == 2:
value = int(input("Enter an integer to reverse the queue until that number: "))
reverse_first_k_items(queue, value)
print(f"The resulting queue after reversing first {value} elements is: ", end="")
queue.ll.print_list()
queue.ll.remove_all_items()
elif choice == 0:
queue.ll.remove_all_items()
break
else:
print("Choice unknown;")
if __name__ == "__main__":
main()

133
T2/Base/Q3 - sort_stack.py Normal file
View File

@ -0,0 +1,133 @@
class ListNode:
def __init__(self, item=None):
self.item = item
self.next = None
class LinkedList:
def __init__(self):
self.size = 0
self.head = None
def print_list(self):
cur = self.head
if cur is None:
print("Empty")
return
while cur is not None:
print(cur.item, end=" ")
cur = cur.next
print()
def find_node(self, index):
if index < 0 or index >= self.size:
return None
temp = self.head
for _ in range(index):
temp = temp.next
return temp
def insert_node(self, index, value):
if index < 0 or index > self.size:
return -1
new_node = ListNode(value)
if index == 0:
new_node.next = self.head
self.head = new_node
self.size += 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None:
return -1
new_node.next = prev_node.next
prev_node.next = new_node
self.size += 1
return 0
def remove_node(self, index):
if self.head is None:
return -1
if index < 0 or index >= self.size:
return -1
if index == 0:
self.head = self.head.next
self.size -= 1
return 0
prev_node = self.find_node(index - 1)
if prev_node is None or prev_node.next is None:
return -1
prev_node.next = prev_node.next.next
self.size -= 1
return 0
def remove_all_items(self):
self.head = None
self.size = 0
class Stack:
def __init__(self):
self.ll = LinkedList()
def push(self, item):
self.ll.insert_node(0, item)
def pop(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def peek(self):
if self.is_empty():
return None
return self.ll.head.item
def is_empty(self):
return self.ll.size == 0
class Queue:
def __init__(self):
self.ll = LinkedList()
def enqueue(self, item):
self.ll.insert_node(self.ll.size, item)
def dequeue(self):
if self.is_empty():
return None
item = self.ll.head.item
self.ll.remove_node(0)
return item
def is_empty(self):
return self.ll.size == 0
def sort_stack(stack):
raise NotImplementedError
def main():
stack = Stack()
while True:
print("1: Insert an integer into the stack;")
print("2: Sort the stack in ascending order;")
print("0: Quit;")
choice = int(input("Please input your choice(1/2/0): "))
if choice == 1:
value = int(input("Input an integer that you want to insert into the stack: "))
stack.push(value)
print("The resulting stack is: ", en="")
stack.ll.print_list()
elif choice == 2:
sort_stack(stack)
print("The resulting stack after sorting it in ascending order is: ", end="")
stack.ll.print_list()
stack.ll.remove_all_items()
elif choice == 0:
stack.ll.remove_all_items()
break
else:
print("Choice unknown;")
if __name__ == "__main__":
main()