How to implement three stacks using a single array

后端 未结 17 765
情书的邮戳
情书的邮戳 2020-12-23 15:10

I came across this problem in an interview website. The problem asks for efficiently implement three stacks in a single array, such that no stack overflows until there is no

17条回答
  •  萌比男神i
    2020-12-23 15:41

    Another solution in PYTHON, please let me know if that works as what you think.

        class Stack(object):
    
        def __init__(self):
            self.stack = list()
    
            self.first_length = 0
            self.second_length = 0
            self.third_length = 0
    
            self.first_pointer = 0
            self.second_pointer = 1
    
        def push(self, stack_num, item):
    
            if stack_num == 1:
                self.first_pointer += 1
                self.second_pointer += 1
                self.first_length += 1
                self.stack.insert(0, item)
    
            elif stack_num == 2:
                self.second_length += 1
                self.second_pointer += 1
                self.stack.insert(self.first_pointer, item)
            elif stack_num == 3:
                self.third_length += 1
                self.stack.insert(self.second_pointer - 1, item)
            else:
                raise Exception('Push failed, stack number %d is not allowd' % stack_num)
    
        def pop(self, stack_num):
            if stack_num == 1:
                if self.first_length == 0:
                    raise Exception('No more element in first stack')
                self.first_pointer -= 1
                self.first_length -= 1
                self.second_pointer -= 1
                return self.stack.pop(0)
            elif stack_num == 2:
                if self.second_length == 0:
                    raise Exception('No more element in second stack')
                self.second_length -= 1
                self.second_pointer -= 1
                return self.stack.pop(self.first_pointer)
            elif stack_num == 3:
                if self.third_length == 0:
                    raise Exception('No more element in third stack')
                self.third_length -= 1
                return self.stack.pop(self.second_pointer - 1)
    
        def peek(self, stack_num):
            if stack_num == 1:
                return self.stack[0]
            elif stack_num == 2:
                return self.stack[self.first_pointer]
            elif stack_num == 3:
                return self.stack[self.second_pointer]
            else:
                raise Exception('Peek failed, stack number %d is not allowd' % stack_num)
    
        def size(self):
            return len(self.items)
    
    s = Stack()
    
    # push item into stack 1
    s.push(1, '1st_stack_1')
    s.push(1, '2nd_stack_1')
    s.push(1, '3rd_stack_1')
    #
    ## push item into stack 2
    s.push(2, 'first_stack_2')
    s.push(2, 'second_stack_2')
    s.push(2, 'third_stack_2')
    #
    ## push item into stack 3
    s.push(3, 'FIRST_stack_3')
    s.push(3, 'SECOND_stack_3')
    s.push(3, 'THIRD_stack_3')
    #
    print 'Before pop out: '
    for i, elm in enumerate(s.stack):
        print '\t\t%d)' % i, elm
    
    #
    s.pop(1)
    s.pop(1)
    #s.pop(1)
    s.pop(2)
    s.pop(2)
    #s.pop(2)
    #s.pop(3)
    s.pop(3)
    s.pop(3)
    #s.pop(3)
    #
    print 'After pop out: '
    #
    for i, elm in enumerate(s.stack):
        print '\t\t%d)' % i, elm
    

提交回复
热议问题