您的位置:首页 > 其它

用两个栈实现一个队列,算法和实现

2013-11-02 18:41 295 查看
#include <iostream>
#include <vector>
#include <stack>
using namespace std;

/*
用两个栈实现一个队列,算法和实现
*/
class Queue_My
{
public:
Queue_My();
void Pop();
void Push(int value);
int Top();
void CreateQueue(const vector<int> & vec);
private:
stack<int,vector<int>> m_stackA;
stack<int,vector<int>> m_stackB;
};
Queue_My::Queue_My()
{}
void Queue_My::CreateQueue(const vector<int> & vec)
{
m_stackA = stack<int,vector<int>>(vec);
}

//入队函数
//算法:使新入队元素始终存放在栈A中,且位于栈顶。
void Queue_My::Push(int value)
{
m_stackA.push(value);
}

//出队函数:
//算法:
//1.优先让m_stackB中元素出栈,栈B中的栈顶元素即为队首元素。
//2.如果栈B为空,把m_stackA中元素出栈并将其压入栈B中,直到使栈A中只剩下栈底元素。
//此时再让此栈底元素出栈即队首元素出队。
void Queue_My::Pop()
{
int topVal;

//如果m_stackB不为空,栈顶元素即为队首元素。
if (!m_stackB.empty())
{
topVal = m_stackB.top();
m_stackB.pop();
return ;

}

else
{
//队中无元素即栈A和栈B都为空。
if (m_stackA.empty())
{
return;
}
//如果栈B为空,把m_stackA中元素出栈并将其压入栈B中,直到使栈A中只剩下栈底元素。
else
{
while(m_stackA.size()>1)
{
topVal = m_stackA.top();
m_stackA.pop();
m_stackB.push(topVal);
}
topVal = m_stackA.top();
m_stackA.pop();
return;
}
}

}

int main()
{
int a[] = {1,2,3};
vector<int> v(a,a + sizeof(a)/ sizeof(int));

Queue_My q;
q.CreateQueue(v);

q.Push(8);
q.Push(3);
q.Pop();
q.Pop();
q.Push(11);
return 0;

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