zoukankan      html  css  js  c++  java
  • 09 用两个栈实现队列

    题目描述:

     用两个栈来实现一个队列,完成队列的Push和Pop操作,即:实现分别在队列尾部插入节点和在队列头部删除节点的功能。 队列中的元素为int类型。

     使用’模板‘扩展为任意类型均可以。

     也可以考虑用两个队列实现栈。

    测试用例:

     1)往的队列里添加、删除元素。

     2)往非空的队列里添加、删除元素。

     3)连续删除元素至队列为空

    解题思路:

    stack1用于存加入队列的数据,当需要删除数据时,将stack1的数据弹出,并存入stack2中,此时栈顶元素为队列最先添加的元素,删除元素时,可以直接删除stack2的栈顶元素。因此当需要添加时,使用stack1.push(),当需要删除时,使用stack2.pop()。若删除时,stack2为空,再次将数据从stack1中 压入stack2中,然后再执行删除工作。若删除时两者stack1和stack2都为空,说明队列为空,不能再删除,直接返回。

    //实现1
    class Solution { public: void push(int node) { stack1.push(node); } int pop() { int toBeDelete; if(!stack2.empty()){ toBeDelete = stack2.top(); //读取要删除的元素 stack2.pop(); //删除元素 }else if(!stack1.empty()){ //将stack1存入到stack2中,然后再删除 while(!stack1.empty()){ stack2.push(stack1.top()); stack1.pop(); } toBeDelete = stack2.top(); //读取要删除的元素 stack2.pop(); //删除元素 }else{ //两个栈都是空的时候
    //因该报错 throw new exception ("queue is empty"); return -1; //通过了程序,但是不确定两个栈为空时,应该返回什么!!! } return toBeDelete; } private: stack<int> stack1; //用于添加元素 stack<int> stack2; //用于删除元素 };
    //实现2
    class Solution { public: void push(int node) { stack1.push(node); } int pop() { int toBeDelete; if(stack2.empty()){ //如果stack2为空,从stack1读取数据 while(!stack1.empty()){ stack2.push(stack1.top()); stack1.pop(); } } if(stack2.empty()){ //说明stack1是空的 //throw new exception("queue is empty") //会报错 //return 0; //不符合常理,因为删除元素0也会返回元素0 throw 1; } toBeDelete = stack2.top(); //读取要删除的元素 stack2.pop(); //删除元素 return toBeDelete; } private: stack<int> stack1; //用于添加元素 stack<int> stack2; //用于删除元素 };  

    注意:等待栈2出完后才能继续入栈不然,不然就会占据栈顶  

    题目描述:

    用两个队列实现栈

    解题思路:

    向一个队列中一直添加元素 ,当需要删除时,根据栈的特点应该删除最后一个元素,所以将该栈的前(n-1)个元素都弹出并压入到另一个队列中,然后删除该队列的元素(只剩要删除的元素)。若要添加元素,向含有元素的队列中添加,若删除元素,重复上述步骤:将前面的元素移动到另一个队列中,删除剩下的最后一个元素。

    基础知识:

     [1] 栈:后进先出。通常不考虑排序,在O(n)时间才能找到栈中的最大最小元素。也可以通过特殊的设计在O(1)时间内得到最大/小值。

     [2] 队列:先进先出(树的宽度优先遍历)

     [3] 可以用两个栈实现队列,也可以用两个队列实现栈。

  • 相关阅读:
    十个经典排序算法
    筛选法求2000以内的10个以上连续非素数组
    算法学习路线
    git 文件重命名
    一个github账户多台电脑代码提交
    SQL起别名
    多个Python环境的构建:基于virtualenv 包
    git学习:忽略部分文件
    git学习:多人协作,标签管理
    git学习4:分支管理
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/10400549.html
Copyright © 2011-2022 走看看