实现思路:
使用栈1来进行入队操作(Push()
),栈2用在执行出队操作(Pop()
)。
每次进行获取队尾元素(Back()
)时,如果栈1为空,需要将栈2中所有元素弹出放入栈1中。
每次进行获取队首元素(Front())
或是弹出队首元素(Pop()
)时,如果栈2为空,需要将栈1中所有元素弹出然后放入栈2中。
因为数据可能同时存在两个栈中,所以,获取队列中元素数量(Size()
)和判断队列是否为空(Empty()
)时两个栈均需进行操作。
实现的栈类型为NewQueue,包括的成员函数如下:
bool Empty()
两个栈都需要为空才为空
std::size_t Size()
加上两个栈中的元素个数
int Front()
如果栈1为空,需要将栈2中元素统统压入栈1
int Back()
如果栈2为空,需要将栈1中元素统统压入栈2
void Push(int newData)
void Pop()
如果栈2为空,需要将栈1中元素统统压入栈2
实现代码:
头文件NewQueue.h
class NewQueue
{
public:
NewQueue() = default;
~NewQueue() = default;
public:
bool Empty();
std::size_t Size();
int Front();
int Back();
void Push(int newData);
void Pop();
private:
void CheckTransferToStack1();
void CheckTransferToStack2();
private:
std::stack<int> m_stack1;
std::stack<int> m_stack2;
};
实现文件NewQueue.cpp
#include "NewQueue.cpp"
bool NewQueue::Empty()
{
return m_stack1.empty() && m_stack2.empty();
}
std::size_t NewQueue::Size()
{
return m_stack1.size() + m_stack2.size();
}
int NewQueue::Front()
{
CheckTransferToStack2();
return m_stack2.top();
}
int NewQueue::Back()
{
CheckTransferToStack1();
return m_stack1.top();
}
void NewQueue::Push(int newData)
{
m_stack1.push(newData);
}
void NewQueue::Pop()
{
CheckTransferToStack2();
m_stack2.pop();
}
void NewQueue::CheckTransferToStack1()
{
if (!m_stack1.empty()) return;
while (!m_stack2.empty())
{
m_stack1.push(m_stack2.top());
m_stack2.pop();
}
}
void NewQueue::CheckTransferToStack2()
{
if (!m_stack2.empty()) return;
while (!m_stack1.empty())
{
m_stack2.push(m_stack1.top());
m_stack1.pop();
}
}