您的位置:首页 > 其它

两个栈实现一个队列

2015-05-30 17:09 288 查看
栈是后进先出的数据结构,只允许在其一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端为栈底,栈的的基本操作为:入栈,出栈,返回栈顶元素,判断栈是否为空,

队列是先进先出的数据结构,只允许在其一端进行插入操作,而在另一端进行删除操作,允许删除的一端称为队头,允许插入的一端称为队尾 队列的基本操作为 : 入队,出队,返回队头元素,判断队列是否为空。

用两个栈stack1,stack2 来模拟队列的入队和出队。将 a,b,c,d 依次入队 a---->b----->c------>d,出队的顺序为 a,b,c,d;

用栈stack1来模拟入队,入队的元素压入stack1, 将,a,b,c,d 入队即为,将a,b,c,d 压入栈stack1中,此时stack2为空栈。 a,b,c,d 出队时,由于队列先进先出的特性。最先出队的为a 此时可以将stack1 的元素全部出栈压入栈stack2 中,此时,stack2 从栈顶到栈底的元素顺序依次为 a ,b,c,d ; 与元素出队的顺序一致,元素出队即从stack2出栈即可。

当队列进行出队操作时而恰好stack2 为空时,需要判断stack1是否为空,若为空则表示此时队列中无元素为空队列,若stack1不空则将栈stack1中的所有元出栈后压入stack2中。

再用stack2的出栈操作来模拟队列的出队操作。

<pre name="code" class="cpp">#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<stack>
#include<queue>
using namespace std;
template<class T> class myqueue
{
public:
myqueue(){};
void push(const T& node);
T pop();
~myqueue(){};
bool empty();
private:
stack<T> stack1;//栈stack1模拟入队时用
stack<T> stack2;//栈stack2模拟出队时用
};
template<class T> void myqueue<T>::push(const T&node)
{
stack1.push(node);
}
template<class T> T myqueue<T>::pop()
{
if(stack2.empty())//栈stack2 为空时要判断栈1中是否有元素,有的话则全部出栈进而压入栈stack2 中
{
while(!stack1.empty())
{
T temp=stack1.top();
stack1.pop();
stack2.push(temp);
}
}
if(stack2.empty())
{
throw  exception("the queue is empty()");
}
T head=stack2.top();
stack2.pop();
return head;
}
template<class T> bool myqueue<T>::empty()
{
if(stack1.empty()&&stack2.empty())//两个栈都为空则表示队列为空
{
return true;
}
else
{
return false;
}
}

int main()
{
myqueue<int> test;
for(int i=0;i<10;i++)
{
test.push(i);
}
while(!test.empty())
{
cout<<test.pop()<<"  ";
}
myqueue<int> test2;
test2.pop();
return 0;

}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: