LeetCode(232):用栈实现队列

题目描述

image1.png

实现思路

我们可以将两个栈分别设置为输入栈s1、输出栈s2
需要输入(push)时,将元素放入s1
需要输出/访问栈顶(pop 或 peek)时,就从s2拿出来

stack的常用函数

  • s.push(ele)-将ele放入栈(void)
  • s.pop()-将栈顶元素弹出栈(void)
  • s.top()-返回栈顶元素(但不弹出)
  • s.empty()-返回布尔值,表示栈是否为空
  • s.size()-返回栈中元素的个数

1、push
入栈操作不用多说,直接push入s1即可
2、pop
我们的目标是从队列开头移除并返回元素(即返回最早入队的元素)
首先检查s2是否为空:
若s2为空,则将s1的元素依次通过top+pop放入s2
(此时在s2栈顶的就是最早入队的元素)
若s2不为空,直接取出s2栈顶元素即可
3、peek
原理与pop完全相同,只不过不需要移除目标元素
4、empty
若s1和s2都为空,则表明队列已空

代码实现(C++)

class MyQueue {
public:
    stack<int> s1; //输入栈
    stack<int> s2; //输出栈
    
    MyQueue() {}
    
    void push(int x) {
        s1.push(x);
    }
    
        int ele;
        if(s2.empty()==false){
            ele=s2.top();
            s2.pop();
        }else{
            while(s1.empty()!=true){
                s2.push(s1.top());
                s1.pop();
            }
            ele=s2.top();
            s2.pop();
        }
        return ele;
    }
    
    int peek() {
        if(s2.empty()==false){
            return s2.top();
        }else{
            while(s1.empty()!=true){
                s2.push(s1.top());
                s1.pop();
            }
            return s2.top();
        }
    }
    
    bool empty() {
        return s1.empty()&&s2.empty() ? true : false;
    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */
原文地址:https://www.cnblogs.com/baebae996/p/13863940.html