• C++利用栈实现队列、利用队列实现栈


    1.利用栈来实现队列

    //利用栈实现队列
    //关键点:利用临时栈将新元素放在原始栈的栈底,从而实现后进后出
    #include<iostream>
    #include<stack>
    using namespace std;
    class MyQueue
    {
    public:
        void push(const int& x) {
            stack<int>temp_stack;
            //假设_data的元素为[1,2,3,4],1所在位置为栈顶,
            //要想实现新元素的后进后出,需要将x放在栈底,即[1,2,3,4,x];
    
            //将原栈里的元素次序反转,即此时临时栈temp_stack为[4,3,2,1]
            //4所在位置为栈顶
            while (!_data.empty()) {
                temp_stack.push(_data.top());
                _data.pop();
            }
            //将新元素放在栈顶,此时临时栈temp_stack为[x,4,3,2,1]
            temp_stack.push(x);
            //再次反转临时栈里的元素的次序,此时栈_data为[1,2,3,4,x]
            //新元素x被放在栈底,从而实现了,x后进后出
            while (!temp_stack.empty())
            {
                _data.push(temp_stack.top());
                temp_stack.pop();
            }
        }
        int pop() {
            int x = _data.top();
            _data.pop();
            return x;
        }
        int peek() {
            return _data.top();
        }
        bool empty() {
            return _data.empty();
        }
    private:
        stack<int> _data;
    };
    
    int main() {
        MyQueue mq;
        mq.push(1);
        mq.push(2);
        mq.push(3);
        cout << mq.pop() << endl;
        mq.push(4);
        mq.push(5);
        cout << mq.pop() << endl;
    }

    2.利用队列实现栈

    //利用队列实现栈
    //关键点:利用临时队列将新元素x放在原始队列头部元素的前面,
    //进而调用pop()时弹出x,从而实现后进先出
    #include<queue>
    #include<iostream>
    class MyStack
    {
    public:
        void push(const int &x) {
            //将data_queue里的所有元素视作一个整体a 
            //临时队列,利用临时队列将新元素x放在a的前面
            //重点在于:如何将x插入队列[4,3,2,1]的头部(假设1所在位置为队列头部),
            //即[4,3,2,1,x](而_data插入x后是[x,4,3,2,1]不能实现x的后进先出)。
            
            std::queue<int> _temp_queue;
            //将x插入临时队列头部,此时_temp_queue为[x]
            _temp_queue.push(x);
            //将_data队列里的元素依次插入_temp_queue,此时_temp_queue为[4,3,2,1,x],
            //此时,已实现临时队列_temp_queue的x后进先出
            while (!_data.empty())
            {
                _temp_queue.push(_data.front());
                _data.pop();
            }
            //_temp_queue中的队列元素依次插入_data队列中。此时_data为[4,3,2,1,x]
            //,pop()时弹出x,实现了队列_data的x后进先出
            while (!_temp_queue.empty()) {
                _data.push(_temp_queue.front());
                _temp_queue.pop();
            }
        }
        int pop() {
            int x = _data.front();
            _data.pop();
            return x;
        }
        int top() {
            return _data.front();
        }
        bool empty() {
            return _data.empty();
        }
    private:
        std::queue<int> _data;//_data数据队列存储元素的顺序就是栈存储元素的顺序
    };
    
    int main() {
        MyStack ms;
        ms.push(3);
        ms.push(4);
        //while(!ms.empty())
        std::cout << ms.pop() << std::endl;
        ms.push(5);
        std::cout << ms.pop() << std::endl;
    }
  • 相关阅读:
    记录一次有意思的XSS过滤绕过2
    2018年总结
    记录一次Oracle注入绕waf
    记录一次有意思的XSS过滤绕过
    绕过阿里云waf进行SQL注入
    CRLF在过滤XSS语句后打Cookie方式
    JavaWeb之商品查看后历史记录代码实现
    Mysql注入小tips --持续更新中
    JDK动态代理(Proxy)的两种实现方式
    ajax 异步刷新
  • 原文地址:https://www.cnblogs.com/indifferent/p/13675127.html
Copyright © 2020-2023  润新知