代码营打卡 Day10

1. 用栈实现队列

队列的规则的先入先出, 而栈的规则是先入的后出, 所以需要用两个栈, 先把队列的元素放到入栈中, 然后再用出栈把元素取出, 就实现了队列的出入规则

这里注意  1. pop对空队列是非法操作, 但题目中默认是合法操作, 所以不考虑

                2. 入栈的元素要全部放入出栈中, 否则会造成混乱

要实现四个功能 1. push 把元素放入队列尾部 2. pop从队列首部移除元素 3. 返回队列首部的元素 4. empty 判断队列是否为空

这里还要注意一个问题, 就是因为pop以后元素就不存在了, 所以在pop之前要先把元素push到出栈中

    int pop() {
        // 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
        if (stOut.empty()) {
            // 从stIn导入数据直到stIn为空
            while(!stIn.empty()) {
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        int result = stOut.top();
        stOut.pop();
        return result;
    }

在peek时, 因为peek只是要查看首部的元素值, 所以在pop获取元素值以后, 要把他push回去

    int peek() {
        int res = this->pop(); // 直接使用已有的pop函数
        stOut.push(res); // 因为pop函数弹出了元素res,所以再添加回去
        return res;
    }

接下来是用python的实现

class MyQueue(object):

    def __init__(self):
        self.stackin  = []
        self.stackout = []


    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        self.stackin.append(x)


    def pop(self):
        """
        :rtype: int
        """
        if self.stackout:
            return self.stackout.pop()
        else:
            for i in range(len(self.stackin)):
                self.stackout.append(self.stackin.pop())
            return self.stackout.pop()



    def peek(self):
        """
        :rtype: int
        """
        a = self.pop()
        self.stackout.append(a)
        return a
        


    def empty(self):
        """
        :rtype: bool
        """
        return not self.stackin and not self.stackout

注意一下, 如果stackout非空, 说明之前已经将stackin元素移入到了stackout之中, 所以要先弹出一个元素并返回

如果stackout为空,则需要将stackin中的所有元素移到stackout之中

2. 用队列来实现栈

可以只用一个队列就实现栈, 关键在于把size-1的元素都弹出后再加入, 那么第size次弹出的元素就是栈中pop的元素了, 一个循环队列的概念

self.que = deque()是初始化一个空的双端队列, deuqe是python中的一种数据结构, 支持在两端快速的添加和删除元素, 所以比普通列表的效率更高

que.popleft()这行代码是将que中的第一个元素(左端元素, 也是第一个进队列的元素), 移到que的末尾, 使得最后一个被加入队列的元素(栈顶元素)可以通过popleft的操作弹出

class MyStack(object):

    def __init__(self):
        self.que = deque()


    def push(self, x):
        """
        :type x: int
        :rtype: None
        """
        self.que.append(x)


    def pop(self):
        """
        :rtype: int
        """
        for i in range(len(self.que)-1):
            self.que.append(self.que.popleft())
        return self.que.popleft()


    def top(self):
        """
        :rtype: int
        """
        return self.que[-1]

如果是c++, 这段就稍微麻烦一点

    int pop() {
        int size = que.size();
        size--;
        while (size--) { // 将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部
            que.push(que.front());
            que.pop();
        }
        int result = que.front(); // 此时弹出的元素顺序就是栈的顺序了
        que.pop();
        return result;
    }

需要先将第一个元素push到队尾, 再将第一个元素弹出队列, 这样循环一直到弹出刚加入的那个元素, 最后将那个栈顶元素的值返回, 并且将那个元素弹出

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值