zoukankan      html  css  js  c++  java
  • 面试题:两个栈模拟队列&&两个队列模拟栈

    两个栈模拟队列(leetcode 面试题09)

    解决方案:定义栈s1和s2,入队放s1,出队的话优先取s2,s2为空则将s1的全部转到s2再取。

    相当于s1放当前后缀,s2放当前前缀。

    class CQueue {
    public:
    
        stack<int>s1, s2;
        CQueue() {
        }
        
        void appendTail(int value) {
            s1.push(value);
        }
        
        int deleteHead() {
            if(s1.empty() && s2.empty())  return -1;
            if(s2.empty())
            {
                while(!s1.empty())
                {
                    s2.push(s1.top());
                    s1.pop();
                }
            }
            int tmp = s2.top();
            s2.pop();
            return tmp;
        }
    };

    两个队列模拟栈(leetcode225)

    解决方案:入栈:将元素进队列A。出栈:判断队列A中元素的个数是否为1,如果等于1,则出队列;如果A中元素多于1,则将队列A中的元素以此出队并放入队列B,直到队列A中的元素留下一个,然后队列A出队列;否则,A为空,同理将B转移到A直至剩一个。

    另一种解法:用一个队列,更好,入栈直接push,出栈将前n-1出队再push,相当于做个循环。

    #include<bits/stdc++.h>
    using namespace std;
    
    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 ret;
            if(q1.empty() && q2.empty())  return -1;
            int sz = q1.size();
            if(sz == 1)
            {
                ret = q1.front();
                q1.pop();
            }
            else if(sz > 1)
            {
                while(q1.size() > 1)
                {
                    q2.push(q1.front());
                    q1.pop();
                }
                ret = q1.front();
                q1.pop();
            }
            else
            {
                while(q2.size() > 1)
                {
                    q1.push(q2.front());
                    q2.pop();
                }
                ret = q2.front();
                q2.pop();
            }
            return ret;
        }
    
        /** Get the top element. */
        int top() {
            int ret;
            if(q1.empty() && q2.empty())  return -1;
            int sz = q1.size();
            if(sz == 1)
            {
                ret = q1.front();
                //q1.pop();
            }
            else if(sz > 1)
            {
                while(q1.size() > 1)
                {
                    q2.push(q1.front());
                    q1.pop();
                }
                ret = q1.front();
                //q1.pop();
            }
            else
            {
                while(q2.size() > 1)
                {
                    q1.push(q2.front());
                    q2.pop();
                }
                ret = q2.front();
                //q2.pop();
                q1.push(q2.front());  // q2剩下的一个要转移完,不然顺序会不对
                q2.pop();
            }
            return ret;
        }
    
        /** Returns whether the stack is empty. */
        bool empty() {
            return q1.empty() && q2.empty();
        }
    };
    
    int main()
    {
        MyStack* obj = new MyStack();
        obj->push(1);
        obj->push(2);
        obj->push(3);
        cout << obj->top() << endl;
        cout <<obj->pop() << endl;
        cout << obj->top() << endl;
        cout <<obj->pop() << endl;
        cout << obj->top() << endl;
    }

    参考链接:https://blog.csdn.net/violet_echo_0908/article/details/50986516

  • 相关阅读:
    python学习6—数据类型之集合与字符串格式化
    python学习5—一些关于基本数据结构的练习题
    21-python-time,random模块的应用
    20-python-装饰器⭐
    19-python-迭代器、生成器
    18-python-文件的操作
    17-python-主要内置函数
    16-python-map、filter函数
    15-python-局部变量全局变量
    14-python-函数
  • 原文地址:https://www.cnblogs.com/lfri/p/12436929.html
Copyright © 2011-2022 走看看