if (minimum_.Empty() && Size() != 0) { Stack right_reversed = right_.GetReversedStack(); right_.DeleteStack(); minimum_ = left_.GetMinStackWithOther(right_reversed); } Node* GetFirstNode() { return head_; } Stack GetMinStackWithOther(Stack other); Stack GetReversedStack(); template Stack Stack::GetMinStackWithOther(Stack other) { Stack min_stack; Node* current_node = head_; bool current_stack = true; while (current_stack || current_node != nullptr) { if (min_stack.Empty() || current_node->value <= min_stack.GetHead().second) { min_stack.Push(current_node->value); } if (current_node->next_node == nullptr && current_stack) { current_node->next_node = other.GetFirstNode(); current_stack = false; } current_node = current_node->next_node; } return min_stack; } template Stack Stack::GetReversedStack() { Stack reversed_stack; Node* current_node = head_; while (current_node != nullptr) { reversed_stack.Push(current_node->value); } return reversed_stack; }