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] 可以用两个栈实现队列,也可以用两个队列实现栈。

posted @ 2019-03-03 09:49  GuoXinxin  阅读(227)  评论(0编辑  收藏  举报