1. 栈:
是限制的线性表插入删除必须在同一端完成。
栈的特点:
先进后出:
入栈将数据沉入栈底,最上面的一个数据是栈顶,获取栈顶元素Top,之后要进行Pop 删除栈顶,才可以取到第二个数据。
2. 队列:
也是对线性表的一种限定,规定插入删除数据必须在异端完成。
队列的特点:
先进先出,存数据的一端叫队尾,出数据的一端叫队头;
入队:存数据; 出队:删除数据
3. 利用两个栈实现一个队列的功能 -- 思路:
声明两个栈,s1,s2,
1. 将元素入栈到s1中去,
2. 判断当栈s2为空时,将s1依次取出栈顶元素,入栈到s2中去,
3. 判断当s2不为空时,打印数据,出栈操作
4. 代码
#include <iostream>
#include <stack>
using namespace std;
/*
两个栈实现一个队列:
实现1,2,3,4,5 入队
1,2,3,4,5 出队
声明两个栈,
入队
1.栈1入栈操作,
出队
2.栈2为空时,将栈1栈顶出栈,入栈到栈2中,
3.栈2不为空时,出栈操作,打印数据
*/
// 类模板
template<typename T>
// 将两个栈的操作封装成类
class Queue
{
public:
// 将元素入栈到s1中去(入队) 队尾存数据
void appendEnd(const T& data);
// 将s1出栈到s2中去 (出队) 队头删除数据
void deleteHead();
private:
// 声明两个栈对象
stack<T> s1; // 入栈操作
stack<T> s2; // 出栈操作
};
// 定义appendEnd函数
// 声明模板
template<typename T>
void Queue<T>::appendEnd(const T& data)
{
// 将元素入栈到 s1中去
s1.push(data);
}
// 定义deleteHead函数
// 声明模板
template<typename T>
void Queue<T>::deleteHead()
{
// 判断栈2是否为空 为空则将s1入栈到s2中去
if (s2.empty())
{
// 判断当栈1不为空时,将栈1出栈,入栈到s2中去
while (!s1.empty())
{
// 依次将栈s1 入栈到栈 s2中去
s2.push(s1.top());
// 删除s1栈顶
s1.pop(); // 注意要删除栈顶操作,要不然会死循环
}
}
// 栈s2不为空 出栈操作
if (!s2.empty())
{
// 打印数据
cout << s2.top() << " ";
// 出栈 (删除栈顶)
s2.pop();
}
}
// 测试函数
void TestAchieveQueue()
{
// 创建Queue类的对象
Queue<int> q_Queue; // 注意要加上模板
// 入队(将元素入栈到s1中去)
q_Queue.appendEnd(1);
q_Queue.appendEnd(2);
q_Queue.appendEnd(3);
q_Queue.appendEnd(4);
q_Queue.appendEnd(5);
// 出队(将s1中的元素依次出栈,入栈到s2中去,打印数据)
q_Queue.deleteHead();
q_Queue.deleteHead();
q_Queue.deleteHead();
q_Queue.deleteHead();
q_Queue.deleteHead();
}
int main()
{
// 测试代码
TestAchieveQueue();
system("pause");
return 0;
}
5. 程序运行结果: