#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;
}
用两个栈实现一个队列,算法和实现
最新推荐文章于 2020-11-23 01:34:55 发布