用栈实现队列

面试题09. 用两个栈实现队列

  • 栈A用于加入元素
  • 栈B用于反转元素。栈顶元素就是队头元素。删除队头时
    • 先判断 B 是否为空,只要 B 不为空, 无论 A 是否为空都是从 B 弹出元素
    • B为空时
      • 若A为空,则返回-1
      • 若A不为空,则将其转反转到B中,返回B的栈顶元素
class CQueue {
private:
    stack<int> A;
    stack<int> B;
public:
    CQueue() {

    }

    void appendTail(int value) {
        A.push(value);
    }

    int deleteHead() {
        if (!B.empty()) { // 只要 B 不为空, 无论 A 是否为空都是从 B 弹出元素
            int tmp = B.top();
            B.pop();
            return tmp;
        } else if (B.empty()) { // B为空时
            if (A.empty()) { // 若A为空,则返回-1
                return -1;
            } else {
                while (!A.empty()) { // 若A不为空,则将其转反转到B中
                    int cur = A.top();
                    A.pop();
                    B.push(cur);
                }
            }
        }
//        此时B被A逆序填充了,返回B的栈顶元素
        int tmp = B.top();
        B.pop();
        return tmp;
    }
};
class CQueue {
private:
    stack<int> A;
    stack<int> B;
public:
    CQueue() {

    }

    void appendTail(int value) {
        A.push(value);
    }

    int deleteHead() {
//        只要B不为空(不用管A是不是空的),则直接弹出
        if (!B.empty()){
            int tmp=B.top();
            B.pop();
            return tmp;
        }
// ***********以下是B为空的情况***********
//        B和A都为空,返回-1
        if (A.empty()){
            return -1;
        }
//      B为空。若A里有元素,则将其翻转到B中,返回B的栈顶元素
        while (!A.empty()){
            int tmp=A.top();
            A.pop();
            B.push(tmp);
        }
        int tmp=B.top();
        B.pop();
        return tmp;
    }
};
class CQueue(object):

    def __init__(self):
        self.A=[]
        self.B=[]


    def appendTail(self, value):
        """
        :type value: int
        :rtype: None
        """
        self.A.append(value)


    def deleteHead(self):
        """
        :rtype: int
        """
        if self.B: return self.B.pop()
        if not self.B and not self.A: return -1
        while self.A:
            self.B.append(self.A.pop())
        return self.B.pop()



# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()

232. 用栈实现队列

在上题的基础上增加了peek操作和判断是否为空操作

  • peek:和pop函数非常类似,只需要把pop函数中相关的(B栈)弹出操作取消掉即可
  • empty:若都为空,则返回true
class MyQueue {
private:
    stack<int> A;
    stack<int> B;
public:
    MyQueue() {

    }

    void push(int x) {
        A.push(x);
    }

    int pop() {
        if (!B.empty()) { // 只要 B 不为空, 无论 A 是否为空都是从 B 弹出元素
            int tmp = B.top();
            B.pop();
            return tmp;
        } else if (B.empty()) { // B为空时
            if (A.empty()) { // 若A为空,则返回-1
                return -1;
            } else {
                while (!A.empty()) { // 若A不为空,则将其转反转到B中
                    int cur = A.top();
                    A.pop();
                    B.push(cur);
                }
            }
        }
//        此时B被A逆序填充了,返回B的栈顶元素
        int tmp = B.top();
        B.pop();
        return tmp;
    }
//    peek:和pop函数非常类似,只需要把pop函数中相关的(B栈)弹出操作取消掉即可
    int peek() {
        if (!B.empty()) { // 只要 B 不为空, 无论 A 是否为空都是取B的栈顶元素
            int tmp = B.top();
//            B.pop();
            return tmp;
        } else if (B.empty()) { // B为空时
            if (A.empty()) { // 若A为空,则返回-1
                return -1;
            } else {
                while (!A.empty()) { // 若A不为空,则将其转反转到B中
                    int cur = A.top();
                    A.pop();
                    B.push(cur);
                }
            }
        }
//        此时B被A逆序填充了,返回B的栈顶元素
        int tmp = B.top();
//        B.pop();
        return tmp;

    }
//    若都为空,则返回true
    bool empty() {
        return A.empty() && B.empty();
    }
};

   转载规则


《用栈实现队列》 M 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
根据字符出现频率排序 根据字符出现频率排序
这类问题主要用到lambda排序 import collections m=collections.Counter(s) m=sorted(m.items(),key=lambda x: -x[1]) map<char, int> m
2021-09-08
下一篇 
697-数组的度 697-数组的度
697. 数组的度 先统计一次数组,得到度 滑动窗口的左右指针用于更新并统计信息 先增大右窗口,得到符合条件的窗口后,开始缩小左窗口 class Solution { public: int findShortestSubAr
2021-09-03
  目录