class Queue:
    def __init__(self):
        self.inbox = Stack()
        self.outbox = Stack()

    def enqueue(self, item):
        while self.outbox.size() != 0:
            self.inbox.push(self.outbox.pop())
        self.inbox.push(item)

    def dequeue(self):
        while self.inbox.size() != 0:
            self.outbox.push(self.inbox.pop())
        return self.outbox.pop()
class MyQueue:
    def __init__(self):
        """
        Initialize your data structure here.
        """
        # 初始化
        self.stack1 = Stack()
        self.stack2 = Stack()

    def push(self, x):
        """
        Push element x to the back of queue.
        :type x: int
        :rtype: void
        """
        self.stack1.items.append(x)

    def pop(self):
        """
        Removes the element from in front of queue and returns that element.
        :rtype: int
        """
        if self.stack2.isEmpty() != True:  #判断栈2是否为空
            return self.stack2.items.pop()
        else:
            if self.stack1.isEmpty() != True:
                while self.stack1.size() != 1:
                    self.stack2.items.append(self.stack1.items.pop())
                return self.stack1.items.pop()
            else:
                if self.stack2.isEmpty() != True:
                    return self.stack2.items.pop()

    def peek(self):
        """
        Get the front element.
        :rtype: int
        """
        if self.stack2.isEmpty() != True:
            if len(self.stack2.items) >= 1:
                return self.stack2.items[len(self.stack2.items) - 1]
        else:
            if self.stack1.isEmpty() != True:
                return self.stack1.items[0]
            else:
                return False

    def empty(self):
        """
        Returns whether the queue is empty.
        :rtype: bool
        """
        return self.stack1.items == [] and self.stack2.items == []

    def size(self):
        return len(self.stack1.items) + len(self.stack2.items)
def eval_expr(expr):
    s = Stack()
    for token in expr.split():
        if token in ['+', '-', '*', '/', '//', '%', '**']:
            if s.size() < 2:
                raise IndexError("Empty Stack, too few operands.")
            else:
                op2 = s.pop()
                op1 = s.pop()
                result = do_math(op1, op2, token)
                s.push(result)
        elif token == '=':
            if s.size() > 1:
                raise IndexError("Stack is not empty, too many operands.")
            else:
                return s.pop()
        # Unknown operator was not on the assignment but I accounted for it.
        # E.g. '?' would be seen as an unknown operator in any expression.
        elif token not in ['+', '-', '*', '/', '//', '%', '**', '='
                           ] and not token.isdigit():
            raise ValueError("Invalid operator.")
        else:
            s.push(int(token))
Exemplo n.º 4
0
def huffman_decoding(data, tree):
    x = 0
    root = tree.root
    decoder_stack = Stack()
    decoded_word = ""
    while x < len(data):
        if data[x] == "0":
            decoder_stack.push(root)
            root = root.left
        elif data[x] == "1":
            decoder_stack.push(root)
            root = root.right
        if root.data != 0:
            decoded_word += root.data
            while decoder_stack.size() != 0:
                root = decoder_stack.pop()
        x += 1
    return decoded_word
Exemplo n.º 5
0
def rpn_calc():
    postfixExpr = input(
        "Please enter an expression in Reverse Polish notation: ")
    operandStack = Stack()
    tokenList = postfixExpr.split()

    for token in tokenList:
        if token in "0123456789":
            operandStack.push(int(token))
        else:
            operand2 = operandStack.pop()
            operand1 = operandStack.pop()
            result = doMath(token, operand1, operand2)
            operandStack.push(result)

    if operandStack.size() > 1:
        raise Exception("The expression is invalid.")

    return operandStack.pop()
Exemplo n.º 6
0
    # 设置长度
    if last_disk_size != None:
        length = last_disk_size[0] - 1
        if length <= 0:
            length = 1
            for i in self.items:
                i.resizemode('user')
                i.shapesize(i.shapesize()[0] + 1, 0.5)
        item.shapesize(*(length, last_disk_size[1]))
    # 海龟位置y坐标
    index = len(self.items) - 1
    item_y = 20 * 0.5 / 2 + index * 20 * 0.5 + self.y
    # 海龟就位
    self.items[index]: Disk.penup()
    self.items[index].goto(self.x, item_y)


Stack.push = push
Stack.__str__ = __str__

screen = turtle.Screen()

from_stack = Stack('From Stack', -300, -150)
for i in range(6):
    from_stack.push(Disk(0))
assist_satck = Stack('Assist Satck', 0, 100)
to_stack = Stack('To Stack', 300, -150)
hanoi(from_stack.size(), from_stack, assist_satck, to_stack)
screen.mainloop()