(一)、C++两个队列实现栈
1、栈定义
栈(Stack)是由有限个数据类型相同元素组成的有序集合,对元素的操作只能在栈顶进行,遵循后进先出(Last In,First Out)的原则。
2、入栈原理
(1)、两个队列实现栈的入栈原理:
两个队列分别为栈队列(S)和辅助队列(T),插入元素时,压入辅助队列(T)中,然后将栈队列(S)中所有元素压入辅助队列(T),交换栈队列(S)和辅助队列(T),得到栈结果
(2)、实例分析
- 插入首元素(2)
/*
插入元素:(2)
辅助队列(T): 空 (2) (2) 空
(T)插入(2) 将(S)中所有元素压入(T)中 交换(T)(S)
==========> ==========> ===============>
栈队列(S): 空 空 空 (2)
*/
- 插入元素(6)
/*
插入元素:(6)
辅助队列(T): 空 (6) (6)(2) 空
(T)插入(6) 将(S)中所有元素压入(T)中 交换(T)(S)
==========> ==========> ===============>
栈队列(S): (2) (2) 空 (6)(2)
*/
- 插入元素(7)
/*
插入元素:(7)
辅助队列(T): 空 (7) (7)(6)(2) 空
(T)插入(7) 将(S)中所有元素压入(T)中 交换(T)(S)
==========> ==========> ===============>
栈队列(S):(6)(2) (6)(2) 空 (7)(6)(2)
*/
- 插入元素(3)
/*
插入元素:(3)
辅助队列(T): 空 (3) (3)(7)(6)(2) 空
(T)插入(3) 将(S)中所有元素压入(T)中 交换(T)(S)
==========> ==========> ===============>
栈队列(S):(7)(6)(2) (7)(6)(2) 空 (3)(7)(6)(2)
*/
- 插入元素(1)
/*
插入元素:(1)
辅助队列(T): 空 (1) (1)(3)(7)(6)(2) 空
(T)插入(1) 将(S)中所有元素压入(T)中 交换(T)(S)
==========> ==========> ===============>
栈队列(S):(3)(7)(6)(2) (3)(7)(6)(2) 空 (1)(3)(7)(6)(2)
*/
(3)、C++代码实现
/**
* @brief 插入
*/
void push(T p_nVal)
{
m_queTemp.push(p_nVal);
while (!m_queStack.empty())
{
m_queTemp.push(m_queStack.front());
m_queStack.pop();
}
std::swap(m_queStack, m_queTemp);
m_nCurrentSize++;
}
2、出栈原理
- 移除栈队列(S)头元素
- C++代码实现
/**
* @brief 移除栈顶元素
*/
void pop()
{
if (m_queStack.empty())
return;
m_queStack.pop();
m_nCurrentSize--;
}
3、整体代码
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
/**
* @namespace 两个队列实现栈
*/
namespace stack_queue
{
template<class T>
struct Stack
{
std::queue<T> m_queStack; // 栈队列
std::queue<T> m_queTemp; // 辅助队列
uint32_t m_nCurrentSize = 0; // 栈元素个数
/**
* @获取栈顶元素
*/
int top() { return m_queStack.front(); }
/**
* @brief 插入
*/
void push(T p_nVal)
{
m_queTemp.push(p_nVal);
while (!m_queStack.empty())
{
m_queTemp.push(m_queStack.front());
m_queStack.pop();
}
std::swap(m_queStack, m_queTemp);
m_nCurrentSize++;
}
/**
* @brief 移除栈顶元素
*/
void pop()
{
if (m_queStack.empty())
return;
m_queStack.pop();
m_nCurrentSize--;
}
/**
* @brief 获取栈大小
*/
void size() { return m_nCurrentSize; }
/**
* @brief 打印
*/
void print_Stack()
{
std::queue<T> stackTemp = m_queStack;
while (!stackTemp.empty())
{
std::cout << stackTemp.front() << " ";
stackTemp.pop();
}
std::cout << std::endl;
}
};
void test_stack_queue()
{
stack_queue::Stack<int> stackNt;
stackNt.push(2);
/*
插入元素:(2)
辅助队列(T): 空 (2) (2) 空
(T)插入(2) 将(S)中所有元素压入(T)中 交换(T)(S)
==========> ==========> ===============>
栈队列(S): 空 空 空 (2)
*/
stackNt.push(6);
/*
插入元素:(6)
辅助队列(T): 空 (6) (6)(2) 空
(T)插入(6) 将(S)中所有元素压入(T)中 交换(T)(S)
==========> ==========> ===============>
栈队列(S): (2) (2) 空 (6)(2)
*/
stackNt.push(7);
/*
插入元素:(7)
辅助队列(T): 空 (7) (7)(6)(2) 空
(T)插入(7) 将(S)中所有元素压入(T)中 交换(T)(S)
==========> ==========> ===============>
栈队列(S):(6)(2) (6)(2) 空 (7)(6)(2)
*/
stackNt.push(3);
/*
插入元素:(3)
辅助队列(T): 空 (3) (3)(7)(6)(2) 空
(T)插入(3) 将(S)中所有元素压入(T)中 交换(T)(S)
==========> ==========> ===============>
栈队列(S):(7)(6)(2) (7)(6)(2) 空 (3)(7)(6)(2)
*/
stackNt.push(1);
/*
插入元素:(1)
辅助队列(T): 空 (1) (1)(3)(7)(6)(2) 空
(T)插入(1) 将(S)中所有元素压入(T)中 交换(T)(S)
==========> ==========> ===============>
栈队列(S):(3)(7)(6)(2) (3)(7)(6)(2) 空 (1)(3)(7)(6)(2)
*/
stackNt.print_Stack(); // 1 3 7 6 2
stackNt.pop();
stackNt.print_Stack(); // 3 7 6 2
/*
栈队列(S):(1)(3)(7)(6)(2) ==========> (3)(7)(6)(2)
*/
}
}// namespace stack_queue
int main()
{
stack_queue::test_stack_queue();
return 0;
}