Iterate through the array twice to simulate the circular nature. Use indices 0 to 2n - 1, taking i % n to wrap around.
Use a monotonic decreasing stack that holds indices. On the second pass, you only pop from the stack (finding answers for elements that wrapped around). You don't push new elements since they're duplicates.
Actually, the simpler approach: iterate 2n times, always use i % n for the index, and only push when i < n. This way elements from the "first half" can find their next greater from the "second half" (which represents the wrap-around).