• 堆栈相关的经典题(c++)


    1.定义队列

    typedef struct node{
    
        int data;
        struct node * next;
        
    }Node;
    typedef struct linkQueue
    {
        Node * first;
        Node * rear;
    
    }Queue;

    2.两个栈实现一个队列

      类定义:

    #include <iostream>
    #include <stack>
    
    using namespace std;
    template<typename T> class CQueue
    {
    public:
        CQueue();
        ~CQueue();
        void appendTail(const T& node);
        T deleteHead();
    private:
        stack<T> stack1;
        stack<T> stack2;
    };

      具体实现:

    template <typename T> CQueue<T>::CQueue()
    {
        cout<<"CQueue"<<endl;
    }
    template <typename T> CQueue<T>::~CQueue()
    {
        cout<<"~CQueue"<<endl;
    }
    template <typename T> void CQueue<T>::appendTail(const T& node)
    {
        stack1.push(node);
        cout<<"appendTail"<<endl;
    
    }
    template <typename T> T CQueue<T>:: deleteHead()
    {
        if(stack2.size()<=0)
        {
            while(stack1.size()>0)
            {
                T& data = stack1.top();
                stack1.pop();
                stack2.push(data);
            }
        }
        if(stack2.size()==0)
        {
            cout<<"deleteHead:error"<<endl;
            return NULL;
        }else
        {
            T & head = stack2.top();
            stack2.pop();
            return head;
        }
        cout<<"deleteHead"<<endl;
    }

      调用:

    int main()
    {
        CQueue<int> cq;
        cq.appendTail(2);
        cq.appendTail(3);
        cq.appendTail(1);
        int i = cq.deleteHead();
        cout << "val: "<<i<< endl;
        return 0;
    }
    

      运行结果:

       val:2

    3.栈的转置

    将当前栈的最底元素移到栈顶,其他元素顺次下移一位,然后继续不包含该栈顶元素的子栈。终止条件:递归下去,直到栈为空。代码如下

    /**采用递归方式实现栈的转置**/
    void Move_bottom2top(stack<int>& s)
    {
        if(s.empty()) return;
        int top1 = s.top();
        s.pop();
        if(!s.empty())
        {
            Move_bottom2top(s);
            int top2 = s.top();
            s.pop();
            s.push(top1);
            s.push(top2);
            return;
        }
        s.push(top1);
    }
    /**栈转置**/
    void Reverse(stack<int> & s)
    {
        if(s.empty())return;
        Move_bottom2top(s);
        int top = s.top();
        s.pop();
        Reverse(s);
        s.push(top);
    }

    4.栈的排序

    和栈的转置思想类似

    /**采用递归方式实现栈的排序**/
    void Move_min2top(stack<int> &s)
    {
        if(s.empty())return;
        int top1 = s.top();
        s.pop();
        if(!s.empty())
        {
            Move_min2top(s);
            int top2 = s.top();
            if(top1>top2)
            {
                s.pop();
                s.push(top1);
                s.push(top2);
                return;
            }
        }
        s.push(top1);
    }
    /**栈排序**/
    void Sort(stack<int> & s)
    {
        if(s.empty())return;
        if(!s.empty())
        {
            Move_min2top(s);
            int top = s.top();
            s.pop();
            Sort(s);
            s.push(top);
        }
    }

     5.两个队列实现栈

      定义栈类

    /**两个队列实现一个栈**/
    template <class T> class CStack
    {
    public:
        CStack();
        ~CStack();
        T pop();
        void push(T e);
    private:
        queue<T> queue1;
        queue<T> queue2;
    };

      实现

      Pop

    template<class T> T CStack<T>::pop()
    {
        cout<<"Pop:"<<endl;
        if(!queue1.empty())
        {
            while(queue1.size()!=1)
            {
                int front = queue1.front();
                queue1.pop();
                queue2.push(front);
            }
            T val = queue1.front();
            queue1.pop();
            return val;
        }
        if(!queue2.empty())
        {
            while(queue2.size()!=1)
            {
                int front = queue2.front();
                queue2.pop();
                queue1.push(front);
            }
            T val = queue2.front();
            queue2.pop();
            return val;
        }
        cout<<"Pop:error stack is null"<<endl;
        return NULL;
    }

      Push

    template<class T>void CStack<T>::push(T e)
    {
        cout<<"push:"<<endl;
        if(!queue1.empty())
        {
            queue1.push(e);
            return;
        }
        if(!queue2.empty())
        {
            queue2.push(e);
            return;
        }
        queue1.push(e);
    }
  • 相关阅读:
    ASM FailGroup验证
    oracle 11g RAC 补丁升级方法
    数据库优化一
    TypeScript(类—继承—多态)
    TypeScript(安装配置—数据类型—函数)
    IE9兼容
    移动端自适应vw、vh、rem
    npm命令随笔
    安卓、IOS兼容问题
    获取页面大小和元素位置offset、client、scroll
  • 原文地址:https://www.cnblogs.com/daimingming/p/3246110.html
Copyright © 2020-2023  润新知