栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
队列也是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
用两个栈实现队列的基本思路是改变栈的“先进后出”的特点为队列特点“先进先出”,所以在出栈的顺序上进行改变。
在Pop() 函数中,将压入栈1的栈顶数据依次压入栈2,在pop出,此时pop的顺序符合队列出队顺序
#include<iostream> //两个栈实现一个队列
#include<stack>
#include<cstdlib>
#include<cassert>
using namespace std;
template<class T>
class Queue
{
public:
void Push(const T& data)
{
s1.push(data);
}
void Pop()
{
assert(s1.size()+s2.size());
if(s2.empty())
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
#include<stack>
#include<cstdlib>
#include<cassert>
using namespace std;
template<class T>
class Queue
{
public:
void Push(const T& data)
{
s1.push(data);
}
void Pop()
{
assert(s1.size()+s2.size());
if(s2.empty())
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
cout<<s2.top();
s2.pop();
}
private:
stack<T> s1;
stack<T> s2;
};
cout<<s2.top();
s2.pop();
}
private:
stack<T> s1;
stack<T> s2;
};
int main()
{
Queue<int> q;
q.Push(1);
q.Push(2);
q.Push(3);
q.Push(4);
q.Pop();
q.Pop();
q.Pop();
q.Pop();
system("pause");
return 0;
}
{
Queue<int> q;
q.Push(1);
q.Push(2);
q.Push(3);
q.Push(4);
q.Pop();
q.Pop();
q.Pop();
q.Pop();
system("pause");
return 0;
}