【LeetCode & 剑指offer刷题】栈与队列题1:9.1 用队列实现栈(225. Implement Stack using Queues)

【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

225. Implement Stack using Queues

Implement the following operations of a stack using queues.
  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • empty() -- Return whether the stack is empty.
Notes:
  • You must use only standard operations of a queue -- which means only push to backpeek/pop from frontsize, and is empty operations are valid.
  • Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue.
  • You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack).
 
//问题:用队列实现栈
/*
方法一:用两个队列
 插入 q1借助辅助队q2在队首插入元素
 删除 q1队首元素出队
 访问 访问q1队首元素
 判断 判断q1是否为空
(Two Queues, push - O(n), pop O(1)
*/
#include <queue>
class MyStack
{
private:
    queue<int> q1,q2;
public:
    /** Initialize your data structure here. */
    MyStack()
    {
       
    }
   
    /** Push element x onto stack. */
    void push(int x)
    {
        while (!q1.empty()) //q1转移到q2
        {
            q2.push(q1.front());
            q1.pop();
        }
        q1.push(x);//将元素插入到q1中(处于队首位置)
        while (!q2.empty()) //q2转移回q1
        {
            q1.push(q2.front());
            q2.pop();
        }
    }
   
    /** Removes the element on top of the stack and returns that element. */
    int pop()
    {
        int top_element = q1.front();
        q1.pop();
        return top_element;
    }
   
    /** Get the top element. */
    int top()
    {
        return q1.front();
    }
   
    /** Returns whether the stack is empty. */
    bool empty()
    {
        return q1.empty();
    }
};
 
/*
方法二:用两个队列
 插入 在queue1中插入
 删除 quue1出队,queue2入队,将queue1中除队尾元素外全部转移到queue2中,再删除queue1中元素即可,最后再q2中元素复制过去q1 (主队q1借助辅助队q2将队尾元素删除)
 访问 访问queue1队尾元素
 判断是否为空 判断queue1是否为空
 
注意:stack只有top,某次只能访问栈顶元素,而queue有front,back,某次可以访问队首和队尾元素,不过只能删除队首元素
Two Queues, push O(1), pop O(n)
*/
#include <queue>
class MyStack
{
private:
    queue<int> q1,q2;
public:
    /** Initialize your data structure here. */
    MyStack()
    {
       
    }
   
    /** Push element x onto stack. */
    void push(int x)
    {
        q1.push(x);
    }
   
    /** Removes the element on top of the stack and returns that element. */
    int pop()
    {
        int top_element = top();
        while(q1.size() > 1) //为删除队尾元素,将q1元素除队尾元素外转移到q2
        {
            q2.push(q1.front());
            q1.pop();//删除第一个元素
        }
        q1.pop(); //删除队尾元素
        while(!q2.empty()) //将元素再转移到q1
        {
            q1.push(q2.front());
            q2.pop();
        }
        return top_element;
    }
   
    /** Get the top element. */
    int top()
    {
        return q1.back(); //返回队尾元素即为栈顶元素
    }
   
    /** Returns whether the stack is empty. */
    bool empty()
    {
        return q1.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();
 */
//方法三:一个队列
//每次push某值后,将队首元素依次push到后面并pop队首元素,直到该值称为队首新的队首元素
/*
class Stack {
public:
    queue<int> que;
    // Push element x onto stack.
    void push(int x) {
        que.push(x);
        for(int i=0;i<que.size()-1;++i){
            que.push(que.front());
            que.pop();
        }
    }
    // Removes the element on top of the stack.
    void pop() {
        que.pop();
    }
    // Get the top element.
    int top() {
        return que.front();
    }
    // Return whether the stack is empty.
    bool empty() {
        return que.empty();
    }
};
*/
 
 

 

posted @ 2019-01-05 16:39  wikiwen  阅读(116)  评论(0编辑  收藏  举报