Chinaunix首页 | 论坛 | 博客
  • 博客访问: 238464
  • 博文数量: 62
  • 博客积分: 973
  • 博客等级: 准尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-16 23:25
文章分类

全部博文(62)

文章存档

2013年(1)

2012年(14)

2011年(47)

分类: C/C++

2011-12-25 01:37:44

1. 用两个堆栈实现一个队列。
思路:对于insert,把数据插入到第一个堆栈中;
      对于remove,如果第二个堆栈为空,把第一个堆栈的所有元素pop出来并放入第二个堆栈中,然后返回第二个堆栈的第一个元素。
// implement Queue by 2 stacks
using namespace std;
class Queueby2s{
private:
    Stack s1;
    Stack s2;
    int len;
public:
    Queueby2s(): len(0) { }
    int getSize() { return len; }
    void enQueue(int n)
    {
        s1.push(n);
        ++len;
    }
    void deQueue()
    {
        int ret;
        if(0 == len)
        {
         cout<<"UNDERFLOW!"<         return -1;
        }
        if(s2.size() == 0)
        {
            while(s1.size() > 0)
           {
              s2.push( s1.pop() );
           }
           ret = s2.pop();
           --len;
           return ret;
        }
    }
};
2. 用两个队列实现一个栈。
思路:对于Push: 如果两个队列都为空,就插入到第一个队列中;否则就插入到非空的那个队列中;
      对于Pop: 把非空的那个队列的每个元素remove出来,然后插入到另一个队列中,直到剩下最后一个元素,然后将其返回。
//implement Stack by 2 queues
class Stackby2q{
private:
    Queue q1;
    Queue q2;
    int len;
public:
    Stackby2q():len(0) {}
    int getSize() {return len;}
    void push(int n)
    {
        //if both queues empty, insert into q1.
        //otherwise, insert into the non-empty queue.
        if( ( q1.size() == 0 ) && ( q2.size == 0 ) )
        {
            q1.enqueue(n);
        }
        else if(q1.size() > 0)
            q1.enqueue(n);
        else if(q2.size() > 0)
            q2.enqueue(n);
        ++len;
    }
    int pop()
    {
        int ret;
        if(0 == len)
        {
            cout<<"UNDERFLOW!"<           return -1;
        }
        if(q1.size() > 0) // q2 is empty
        {
            while(q1.size() > 1)
            q2.enqueue( q1.dequeue() );
            ret = q1.dequeue();
         return ret;
        }
        else // q1 is empty
        {
            while(q2.size() > 1)
            q1.enqueue( q2.dequeue() );
            ret = q2.dequeue();
            return ret;
        }
    }
};
3. 用1个栈实现一个队列。
思路:用递归的方法把数据从最底部移出来。
 
4.用1个队列实现一个栈。
思路:对于每次pop,用递归的方法反转队列元素的排列,然后返回第一个元素。
 
 
阅读(5697) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~