用两个栈实现一个队列



思路:
      主要抓住栈的“先进后出”和队列的“先进先出”。
      s1是入栈的,s2是出栈的。
  1. 入队列,直接压到s1是就行了。
  2. 出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素;再把s2的所有元素全部压回s1中。
代码实现:

#include <iostream>
using namespace std;

template <class T>
class Stack
{
public :
     Stack():_stack(NULL),_capacity(0),_top(0)
     {
     }
     Stack( int capacity):_stack(NULL),_top(0)
     {
          assert(capacity > 0); //确保指定的栈的初始容量大于零
          _stack = new T[capacity];
     }
     ~Stack()
     {
           delete[] _stack;
          _top = 0;
          _capacity = 0;
     }

      void Push(T elem)
     {
           if(_top == _capacity)// 若当前栈已满,则进行扩容
          {
              T* temp = new T[_capacity*2+1];
              _capacity = _capacity*2+1;
              memcpy(temp,_stack, sizeof(T)*_top);
               delete[] _stack;// 将当前的栈空间释放
              _stack = temp;
          }
          _stack[_top++] = elem;
     }

      void Pop()
     {
           if(Empty())
          {
              
               return;
          }
          
          _stack[--_top] = NULL;
     }

      void Pop(T& elem)
     {
          elem = _stack[--_top];
          stack[_top] = NULL;
     }
 
      const T& Top()
     {
           return _stack[_top - 1];
     }

      bool Empty()
     {
           return _top == T();
     }

private :
     T* _stack; //定义指向栈数组的指针
      int _capacity;// 栈的容量
      int _top;// 栈顶的下一个位置处下标
};

template <class T>
class Queue
{
public :
     Queue()
     {
     }
     ~Queue()
     {}
      bool Empty()
     {
           return(s1.Empty()&&s2.Empty());
     }
      void Push(T elem)
     {
      if(s1.Empty()&&!s2.Empty())
          {
               while(!s2.Empty())
              {
                   s1.Push(s2.Top());
                   s2.Pop();
              }
              s1.Push(elem);
           }
           else 
              s1.Push(elem);
     }
      void Pop()
     {
           if(Empty())
          {
              cout<< "Queue is not Pop" <<endl;
              exit(-1);
          }
           if(s1.Empty()&&!s2.Empty())
          {
              s2.Pop();
          }
           if(!s1.Empty()&&s2.Empty())
          {
               while(!s1.Empty())
              {
                   s2.Push(s1.Top());
                   s1.Pop();
              }
              s2.Pop();
          }  
     }

      const T& Top()
     {
           if(Empty())
          {
              cout<< "Queue is NULL!!!" <<endl;
              exit(-1);
          }
           while(!s1.Empty())
          {
              s2.Push(s1.Top());
              s1.Pop();
          }
          T tmp =  s2.Top();
           while(!s2.Empty())
          {
              s1.Push(s2.Top());
              s2.Pop();
          }
           return tmp;
     }
      void Print()
     {
           while(!s1.Empty())
          {
              s2.Push(s1.Top());
              s1.Pop();
          }
           while(!s2.Empty())
          {
              cout<<s2.Top()<< " ";
              s2.Pop();
          }
          cout<<endl;
     
     }
private :
     Stack<T> s1;
     Stack<T> s2;
};
int main()
{
     Queue< int> q1;
     for(int i=0;i<100;++i)
     {
        q1.Push(i);
     }
     q1.Pop;
     
     q1.Print();
     system( "pause");
      return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值