栈和队列结合的常见问题

36 阅读1分钟

问题一: 使用两个栈实现一个队列

思路: 假设我们使用的两个栈为S1和S2,其中S1主要是用来push数据的,当需要查看数据的时候,将S1中的数据取出放到S2中然后S2中的栈顶即使我们模拟的队列的队头元素。

代码

#include <iostream>
#include <stack>

using namespace std;

class MyQueue {
public:
    /** Initialize your data structure here. */
    MyQueue() {

    }
    
    void push(int x) {
      s1.push(x);
    }
    
    // 取出队头元素
    int pop() {
      if (s2.empty()) {
        s2.push(s1.top());
        s1.pop();
      }

      int val = s2.top();
      s2.pop();

      return val;
    }
    
    // 查看队头元素
    int peek() {
      if (s2.empty()) {
        s2.push(s1.top());
        s1.pop();
      }

      int val = s2.top();

      return val;
    }

    int empty() {
      return s1.empty() && s2.empty();
    }

private:
  stack<int> s1; 
  stack<int> s2;
};

int main() {

  return 0;
}

问题二: 使用两个队列实现一个栈

思路: 假设我们有两个队列,q1存放新入栈的元素,q2存储已经调整好的栈的数据。当往q1中push新的数据后将q2中的数据出队push到q1中。(我们也可以这样判断:将新元素push到空的队列中,然后把另一个队列的数据出队push到这个队列的后面)

代码

#include <queue>

using namespace std;

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

  }

  ~MyStack() {
    delete q1;
    delete q2;

    q1 = nullptr;
    q2 = nullptr;
  }

  void push(int x) {
    q1->push(x);
    while (!q2->empty())
    {
      q1->push(q2->front());
      q2->pop();
    }

    // 让q1指向空的,q2指向有数据的队列
    queue<int>* p = q1;
    q2 = q1;
    q1 = p;
    
  }

  int pop() {
    int val = q2->front();
    q2->pop();

    return val;
  }


  int top() {
    int val = q2->front();

    return val;
  }

  bool empty() {
    return q2->empty();
  }



private:
  queue<int>* q1;   // 我们使用q1永远指向空的队列
  queue<int>* q2;   // 我们使用q2永远指向不为空的队列

};


int main() {

  return 0;
}