用两个栈实现队列和用两个队列实现一个栈
来源:互联网 发布:人工智能社会 编辑:程序博客网 时间:2024/05/18 00:28
转自:http://blog.chinaunix.net/uid-26448049-id-3048424.html
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!"<<endl;
return -1;
}
if(s2.size() == 0)
{
while(s1.size() > 0)
{
s2.push( s1.pop() );
}
ret = s2.pop();
--len;
return ret;
}
}
};
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!"<<endl;
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!"<<endl;
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;
}
}
};
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!"<<endl;
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,用递归的方法反转队列元素的排列,然后返回第一个元素。
0 0
- 用两个栈实现队列 & 两个队列实现一个栈
- 两个栈实现队列&&用两个队列实现一个栈
- 用两个栈实现一个队列和用两个队列实现一个栈
- 用两个栈实现一个队列和用两个队列实现一个栈
- 用两个栈实现一个队列:实现出队列和入队列功能,用两个队列实现一个栈
- 用两个栈实现队列和用两个队列实现一个栈
- 用两个栈实现队列和用两个队列实现一个栈
- 用两个栈实现队列和用两个队列实现一个栈
- 面试题7:用两个栈实现队列和用两个队列实现一个栈
- 用两个栈实现队列和用两个队列实现一个栈
- 简单题_用两个栈实现队列和用两个队列实现一个栈
- 用两个栈实现一个队列,算法和实现
- 用两个栈实现一个队列
- 用两个栈实现一个队列
- 用两个栈实现一个队列
- 用两个队列实现一个栈
- 用两个栈实现一个队列功能
- 用两个栈实现一个队列
- 自定义集合
- Linux学习笔记(03-11)vi、tar命令
- C++绑定到Lua
- android 自定义控件 Switch
- Conversion to Dalvik format failed with error 1
- 用两个栈实现队列和用两个队列实现一个栈
- 程序员必须知道的十大基础算法及其讲解
- 数组首地址&a偏移一个单位
- Linux C编程一站式学习第三章
- Python学习笔记1——python的关键要素
- 腾讯后台开发面试题
- uva - 1442(cav 递推类 ,思路)
- 互联网大脑的情绪,智商和梦境-互联网神经学系列第四篇
- POJ 3252 Round Numbers