示例#1
0
class QueueUsingStack(object):
    def __init__(self):
        self._stack_one = Stack()
        self._stack_two = Stack()
    
    def __str__(self):
        return self._stack_one.__str__()
    
    def enqueue(self, element):
        '''
            :param element: element to be enqueued in the queue
        '''
        while not self._stack_one.is_empty():
            self._stack_two.push(self._stack_one.pop())
        
        self._stack_one.push(element)

        while not self._stack_two.is_empty():
            self._stack_one.push(self._stack_two.pop())
        return

    def dequeue(self):
        if self._stack_one.is_empty():
            raise UnderflowException
        return self._stack_one.pop()
def stack_span(prices):
    st = Stack()
    nelements = len(prices)
    span = [0] * nelements
    for i in range(nelements):
        while not (st.is_empty()) and prices[st.top()] <= prices[i]:
            _ = st.pop()
        span[i] = i + 1 if st.is_empty() else i - st.top()
        st.push(i)
    return span
class TestStack(unittest.TestCase):

    def setUp(self) -> None:
        self.st = Stack()

    def test_is_empty(self):
        self.assertTrue(self.st.is_empty(), "The stack is not empty")
        self.assertRaises(IndexError, self.st.pop)

    def test_repr(self):
        self.assertEqual("Stack()", repr(self.st), "The repr method does not work properly")

    def test_push_one_item(self):
        self.st.push(2)
        self.assertFalse(self.st.is_empty())
        self.assertEqual("Stack(2)", str(self.st))

    def test_push_multiple_items(self):
        self.st.push(3)
        self.st.push(10)
        self.assertEqual("Stack(3, 10)", str(self.st))
        popped_item = self.st.pop()
        self.assertEqual(10, popped_item)

    def test_is_full(self):
        for i in range(10):
            self.st.push(i)
        self.assertTrue(self.st.is_full())
        self.assertRaises(OverflowError, self.st.push, 12)

    def test_pop_one_item(self):
        self.st.push(3)
        popped_item = self.st.pop()
        self.assertEqual(3, popped_item)

    def test_pop_multiple_items(self):
        self.st.push(3)
        self.st.push(10)
        popped_item = self.st.pop()
        self.assertEqual(10, popped_item)
        popped_item = self.st.pop()
        self.assertEqual(3, popped_item)

    def test_type(self):
        self.assertRaises(TypeError, self.st.push, "3")
        self.assertRaises(TypeError, self.st.push, 3.1)
        self.assertRaises(TypeError, self.st.push, True)

    def test_top_non_empty_stack(self):
        self.st.push(3)
        self.st.push(10)
        self.assertEqual(10, self.st.top())

    def test_top_empty_stack(self):
        self.assertRaises(IndexError, self.st.top)
示例#4
0
 def pre_order_not_recursion(self):
     pre_order_list = []
     node = self
     s = Stack()
     while node or not s.is_empty():
         while node:
             pre_order_list.append(node)
             s.push(node)
             node = node.left
         if not s.is_empty():
             node = (s.pop()).right
     return pre_order_list
示例#5
0
 def in_order_not_recursion(self):
     in_order_list = []
     node = self
     s = Stack()
     while node or not s.is_empty():
         while node:
             s.push(node)
             node = node.left
         if not s.is_empty():
             node = s.pop()
             in_order_list.append(node)
             node = node.right
     return in_order_list
def reverse_string(input_string):
    s = Stack()
    for i in input_string:
        s.push(i)

    rev_string = ''
    while not s.is_empty():
        rev_string = rev_string + (s.pop())

    return rev_string
示例#7
0
 def test_push_five_elements_to_stack_and_pop_all_elements(self):
     stack = Stack()
     langs = ['python', 'java', 'ruby', 'php', 'go']
     for lang in langs:
         stack.push(lang)
     self.assertEqual(len(langs), stack.size())
     for i in range(len(langs)):
         element = stack.pop()
         self.assertEqual(element, langs[len(langs) - i - 1])
     self.assertTrue(stack.is_empty())
示例#8
0
    def pre_order_traverse(root):
        """ please refer to http://learn.hackerearth.com/tutorial/trees/19/iterative-tree-traversals/
        """
        stack = Stack()
        p = root
        while True:
            while p is not None:
                # print node and store the node in the stack
                print p,
                stack.push(p)
                p = p.lchild

            # visit the right child
            if not stack.is_empty():
                p = stack.pop()
                p = p.rchild

            if stack.is_empty() and p is None:
                break

        print
示例#9
0
    def in_order_traverse(root):
        """ please refer to http://learn.hackerearth.com/tutorial/trees/19/iterative-tree-traversals/
        """
        stack = Stack()
        p = root
        while True:
            while p is not None:
                # store a node in the stack and visit its left child
                stack.push(p)
                p = p.lchild

            # if there are nodes in the stack to which we can move up, then pop it
            if not stack.is_empty():
                p = stack.pop()
                print p,
                # visit the right child
                p = p.rchild

            if stack.is_empty() and p is None:
                break

        print
示例#10
0
def infix2postfix(infix):
    s = Stack()
    l = []

    linfix = infix.split()
    priority = {"*": 3, "/": 3, "+": 2, "-": 2, "(": 1}
    for i in linfix:
        if i == "(":
            s.push(i)
        elif i == ")":
            t = s.pop()
            while not s.is_empty() and t != "(":
                l.append(t)
                t = s.pop()
        elif i in "+-*/":
            while not s.is_empty() and priority[s.peek()] >= priority[i]:
                l.append(s.pop())
            s.push(i)
        else:
            l.append(i)
    while not s.is_empty():
        l.append(s.pop())

    return " ".join(l)
 def size(self):
     if self.root is None:
         return 0
     stack = Stack()
     stack.push(self.root)
     size = 1
     while not stack.is_empty():
         node = stack.pop()
         if node.left:
             size += 1
             stack.push(node.left)
         if node.right:
             size += 1
             stack.push(node.right)
     return size
示例#12
0
def dfs_stack(root, fn):
    stack = Stack()
    stack.push(root)
    visited = defaultdict(bool)
    visited[root] = True
    fn(root)

    while not stack.is_empty():
        node = stack.get_top()
        for child in node.get_children():
            if not visited.get(child):
                fn(child)
                visited[child] = True
                stack.push(child)
            else:
                stack.pop()
class ParenthesisMatching(object):
    def __init__(self, parenthesis):
        self.parenthesis = parenthesis
        self.stack = Stack()

    def is_match(self):
        maps = {")": "(", "]": "[", "}": "{"}
        for p in self.parenthesis:
            if p in "([{":
                self.stack.push(p)
            elif p in ")]}":
                if self.stack.is_empty():
                    return False
                else:
                    top = self.stack.pop()
                    if maps[p] != top:
                        return False
        return True
    def reverse_levelorder_print(self, start, traversal):
        if start is None:
            return
        queue = Queue()
        stack = Stack()
        queue.enqueue(start)
        while len(queue) > 0:
            node = queue.dequeue()
            stack.push(node)

            if node.right:
                queue.enqueue(node.right)
            if node.left:
                queue.enqueue(node.left)

        while not stack.is_empty():
            node = stack.pop()
            traversal += str(node.value) + '-'
        return traversal
示例#15
0
class BitConversion(object):
    def __init__(self, dec):
        self.dec = dec
        self.stack = Stack()
        self.base = "0123456789abcdef"

    def conversion(self, bit):
        if bit not in (2, 8, 16):
            raise ValueError("bit must in (2, 8, 16)")
        while self.dec > 0:
            remainder = self.dec % bit
            self.stack.push(self.base[remainder])
            self.dec = self.dec // bit

        result = []
        while not self.stack.is_empty():
            result.append(self.stack.pop())

        return "".join(result)
示例#16
0
def is_paren_balanced(paren_string):
    s = Stack()
    index = 0

    while index < len(paren_string):
        paren = paren_string[index]

        if paren in '{[(':
            s.push(paren)
        else:
            if s.is_empty():
                return False
            else:
                last_paren = s.pop()
                if not is_match(last_paren, paren):
                    return False
        index += 1

    return True
示例#17
0
    def post_order_recursion(self):
        post_order_list = []
        node = self
        pre_node = None
        current_node = None
        s = Stack()
        s.push(node)

        while not s.is_empty():
            current_node = s.top()
            if (not current_node.left and not current_node.right) or \
                    (pre_node and ((current_node.left and pre_node.key == current_node.left.key)
                                   or (current_node.right and pre_node.key == current_node.right.key))):
                post_order_list.append(current_node)
                s.pop()
                pre_node = current_node
            else:
                if current_node.right:
                    s.push(current_node.right)
                if current_node.left:
                    s.push(current_node.left)
        return post_order_list
示例#18
0
 def test_no_element_in_stack(self):
     stack = Stack()
     self.assertTrue(stack.is_empty())