栈和队列相互实现

1.用栈实现队列

  • 题目来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/implement-queue-using-stacks
  • 题目要求:

    实现 MyQueue 类:
    void push(int x) 将元素 x 推到队列的末尾
    int pop() 从队列的开头移除并返回元素
    int peek()返回队列开头的元素
    boolean empty() 如果队列为空,返回 true ;否则,返回 false

将一个栈当作输入栈,用于压入数据;另一个栈当作输出栈。每次输出时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。

class MyQueue {
public:
    //使用两个栈来模拟队列的操作
    //in和out分别用来模拟入栈和出栈
    stack<int> stIn;
    stack<int> stOut;
    MyQueue() {   
    }
    void push(int x) {
    	//push不用处理stOut栈
    	//这样使得在插入到队列时只用操作一个栈
        stIn.push(x);
    }
    int pop() {
        //只有专门用来弹出的栈为空才会再次压入
        //如果弹出栈为空,就将元素全部转移到这个栈
        if(stOut.empty()){
            while(!stIn.empty()){
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        int res = stOut.top();
        stOut.pop();
        return res;
    }
    
    int peek() {
        int res = this->pop();
        //不应该弹出,所以要添加回去,弹出再添加,元素的位置不会改变
        stOut.push(res);
        return res;
    }
    
    bool empty() {
        return stIn.empty() && stOut.empty();
    }
};

/**
 * 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();
 */

2.用队列实现栈

  • 题目来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/implement-stack-using-queues
  • 题目要求:

    实现 MyStack 类:
    void push(int x) 将元素 x 压入栈顶。
    int pop() 移除并返回栈顶元素。 int
    top() 返回栈顶元素。
    boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

由于队列的顺序是FIFO,我们要想使其变成FILO的话就可能要借助辅助队列,使得它在辅助队列的帮助之下可以实现一些对尾部元素的操作。

但是其实对于队列而言,其在尾部插入元素,头部删除元素,这就很像一个带头结点的链表,所以我们可以利用一个队列本身,使用类似循环的操作式队列完成类似栈的操作。

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

    }
    
    void push(int x) {
        queIN.push(x);
    }
    
    int pop() {
    	//要输出最后一个元素
    	//逐个处理最后一个元素前面的所有元素
        int size = queIN.size()-1;
        int temp;
        while(size--){
        	//前面的元素按照顺序放到尾元素后面
            temp = queIN.front();
            queIN.push(temp);
            queIN.pop();    
        }
        int res = queIN.front();
        queIN.pop();
        return res;
    }
    
    int top() {
        return queIN.back();
    }
    
    bool empty() {
        return queIN.empty();
    }
};

/**
 * 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();
 */

你可能感兴趣的:(数据结构与算法,数据结构)