自学内容网 自学内容网

[E思维] lc225. 用队列实现栈(模拟题+思维+常见)

1. 题目来源

链接:225. 用队列实现栈

2. 题目解析

常见问题,栈实现队列,队列实现栈。但是个人感觉,队列实现栈要稍微难一点点。这两个问题,实际上都是考思路,因为实现效率都得是 O ( n ) O(n) O(n),没有实际的应用意义。

两个队列,再怎么倒来倒去,会发现数据的顺序是不会发生改变的,这点和栈是有区别的。所以思路会稍微难一点点。

思路一:两个队列实现

  • q1,q2。q1 用来存储当前的元素,q2 作为辅助队列。
  • 当新来一个元素时,往 q2 添加,然后再将 q1 的元素依次出队加到 q2 中,再交换一下 q1、q2 内的元素就行,相当于再把 q2 的所有元素再加到 q1 中去。
  • 例如:1,2,3。
  • 第一次,就是把 1 添加到 q1。
  • 第二次,2 先加到 q2,然后把 q1 中的 1 加到 q2,这样子,2 将先出队,1 将后出队,达到了栈的效果。
  • 第三次,3 先加到 q2,然后把 q1 中的 2、1 加到 q2,这样子,3 将先出队,2、1 将后出队,达到了栈的效果。

这个思路下,代码很简洁,用了 swap 优化了代码结构,但是效率依旧是 O ( n ) O(n) O(n)


思路二:一个队列实现

  • 这个思路比较直接,就是环形队列的思想
  • 每次新元素来之前,先统计队列中目前有多少元素,再将新元素先加到队尾,然后将前面的所有元素依次出队再入队,就行。
  • 例如:1,2,3
  • 第一次,将 1 加入队列。
  • 第二次,将 2 加入队列队尾,提前计算了队列中元素个数是 1 个,然后将 1 出队再入队,就变成了 2、1,已经符合了栈中的元素规则。
  • 第三次,将 3 加入到队列队尾,提前计算了队列中元素个数是 2个,然后将 2、1 出队再入队,就变成了 3 2 1,符合栈中的元素规则。

这个思路下,代码也很简洁,效率是 O ( n ) O(n) O(n)


在本问题下,没有 O ( 1 ) O(1) O(1) 做法,有时候会使劲往这方面去想,hh


  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

思路一:

class MyStack {
public:
    queue<int> q1, q2;
    MyStack() {

    }
    
    void push(int x) {
        q2.push(x);
        while (q1.size()) {
            int x = q1.front(); q2.push(x); q1.pop();
        }
        swap(q1, q2);
    }
    
    int pop() {
        int x = q1.front(); q1.pop();
        return x;
    }
    
    int top() {
        return q1.front();
    }
    
    bool empty() {
        return !q1.size();
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

思路二:

class MyStack {
public:
    queue<int> q;
    MyStack() {

    }
    
    void push(int x) {
        int n = q.size();q.push(x);
        for (int i = 0; i < n; i ++) q.push(q.front()), q.pop();
    }
    
    int pop() {
        int x = q.front(); q.pop();
        return x;
    }
    
    int top() {
        return q.front();
    }
    
    bool empty() {
        return !q.size();
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

原文地址:https://blog.csdn.net/yl_puyu/article/details/136474496

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!