zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    四叔的c++入门课(6) 条件语句
    四叔的c++入门课(5)变量类型
    四叔的c++入门课程(4)赋值语句与表达式
    四叔的c++入门课(3)变量
    如何选购笔记本电脑?
    四叔的c++入门课(2)Hello World
    四叔的c++入门课(1)什么是编程
    CSS3 transition-property属性
    display:inline、block、inline-block的区别?
    wps怎样删除空白页 WPS文档的空白页如何删除
  • 原文地址:https://www.cnblogs.com/indifferent/p/13675127.html
Copyright © 2011-2022 走看看