用两个栈实现一个队列的功能 && 两个队列实现一个栈的功能 && 代码实例

 用两个栈实现一个队列的功能 

 数据结构的说明:

栈   :先入后出   FILO

队列:先入先出   FIFO

 实现方式一,具体:

队列入列:栈A入栈;

举例:将A.B.C.D入列,从栈顶到栈底依次为:D C B A;

队列出列:判断栈元素个数是否为1,如为真,弹出;

如为假,栈A所有元素出栈POP,压入栈B;栈B栈顶元素POP;栈B所有元素压入栈A。

举例:栈A弹栈,栈B压栈,栈B从栈顶到栈底依次为: A B C D; 将栈顶元素A弹栈,将剩余元素压回栈A;栈A从栈顶到栈底依次为: B C D;

 

实现方式二,具体:

队列入列:判断栈元素个数是否为1,如为真,弹出;

如为假,栈A所有元素出栈POP,压入栈B;压入新元素到栈A;栈B所有元素压栈入栈A。

 队列出列:栈A出栈;;

 

 

结束,总结:实现了队列的入队和出对操作。

 

用两个队列实现一个栈的功能 

 实现方式一,具体:

入栈:所有元素依次入队列A;

举例:将A.B.C.D入栈,从队列尾部到队列首部依次为:D C B A;

出栈:判断栈元素个数是否为1,如为真,队列A出列;

如为假,队列A所有元素出队列,入队列B,最后一个元素不入队列B,输出该元素;队列B所有元素入队列A;

举例:将D C B A出列,D输出来,C B A入队列B,最后返回到队列A。实现了后进先出。

 

实现方式二,具体:

入栈:和方式一出栈类似

出栈:和方式一入栈类似

 

 

结束,总结:实现了栈的入栈和出栈操作。

 

 

 代码实例

//用两个栈实现队列的功能
template<class T>
class deque_from_stack
{
public:
 deque_from_stack(){size = 0;}

 void push(T& element)
 {
  stack_one.push(element);
  size = stack_one.size();
 }

 T pop()
 {
  assert(this->size > 0);
  T result = 0 ;
  if(1 == this->size)
  {
   result = stack_one.top();
   stack_one.pop();
   this->size = 0;
   return result;
  }
  if(this->size > 1)
  {
   while(stack_one.size())
   {
    stack_two.push(stack_one.top());
    stack_one.pop();
   }
   result = stack_two.top();
   stack_two.pop();
   while(stack_two.size())
   {
    stack_one.push(stack_two.top());
    stack_two.pop();
   }
   this->size--;
   return result;
  }
 }

public:
 stack<T> stack_one;  //栈1
 stack<T> stack_two;  //栈2
 size_t  size;   //元素的个数计数器
}; 

int main(int argc, char* argv[])
{
 int i = 0;
 
 //测试一
 cout << "deque_from_stack :" <<endl;
 deque_from_stack<int> d_s_s;
 for (i = 1; i < 5; i++)
 {
  cout << i << " come in " << endl;
  d_s_s.push(i);
 }
 for (i = 1; i < 5; i++)
 {
  cout << d_s_s.pop() << " go out " << endl;
 }
 cout << endl;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值