剑指offer——栈与队列之间的相互实现

来源:互联网 发布:淘宝手机端详情编辑 编辑:程序博客网 时间:2024/06/05 23:39

题目描述1:

用两个栈来实现一个队列,完成队列的Push和Pop操作。在线编程见用两个栈实现队列。

分析:队列的特点是“先进先出”,而栈的特点是“先进后出”。始终维护s1作为存储空间,以s2作为临时缓冲区。入队时,将元素压入s1。出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。具体分析见下图:


代码如下:

class Solution{public:    void push(int node) {        stack1.push(node);    }    int pop() {        int ans;        if(stack2.empty())        {            while(!stack1.empty())            {                stack2.push(stack1.top());        stack1.pop();            }        }        ans = stack2.top();        stack2.pop();        return ans;    }private:    stack<int> stack1;    stack<int> stack2;};

题目描述2:

用两个队列来实现一个栈,完成栈的Push和Pop操作。

分析:假设有两个队列Q1和Q2,当二者都为空时,入栈操作可以用入队操作来模拟,可以随便选一个空队列,假设选Q1进行入栈操作,现在假设a,b,c依次入栈了(即依次进入队列Q1),这时如果想模拟出栈操作,则需要将c出栈,因为在栈顶,这时候可以考虑用空队列Q2,将a,b依次从Q1中出队,而后进入队列Q2,将Q1的最后一个元素c出队即可,此时Q1变为了空队列,Q2中有两个元素,队头元素为a,队尾元素为b,接下来如果再执行入栈操作,则需要将元素进入到Q1和Q2中的非空队列,即进入Q2队列,出栈的话,就跟前面的一样,将Q2除最后一个元素外全部出队,并依次进入队列Q1,再将Q2的最后一个元素出队即可。

/* 用两个队列模拟入栈操作 */  void push(PQUEUE pS1,PQUEUE pS2,int val)  {      if(is_empty(pS2))          en_queue(pS1, val);      else          en_queue(pS2, val);  }    /* 用两个队列模拟出栈操作 */  bool pop(PQUEUE pS1,PQUEUE pS2,int *pData)  {      if(is_empty(pS1) && is_empty(pS2))          return false;        int DelData;      if(!is_empty(pS2))      {          int len = length(pS2);          while(len-- > 1)          {              de_queue(pS2,&DelData);              en_queue(pS1,DelData);          }          //将队列的最后一个元素出队,作为出栈元素          de_queue(pS2,pData);          return true;      }      if(!is_empty(pS1))      {          int len = length(pS1);          while(len-- > 1)          {              de_queue(pS1,&DelData);              en_queue(pS2,DelData);          }          //将队列的最后一个元素出队,作为出栈元素          de_queue(pS1,pData);          return true;      }  }  

参考资料:

用两个栈实现队列

【剑指offer】两个队列实现一个栈

0 0
原创粉丝点击