栈的特点:先进后出(FILO)
队列的特点:先进先出(FIFO)
用两个栈实现一个队列
基本思路:
2个栈,Save和Temp,Save用来存储数据,Temp用来临时存储
-
void push(int n); //在队列末尾加入一个元素
直接在Save的队头push一个数进去 -
int back(); //返回最后一个元素
同样直接返回Save.top(),返回Save的栈顶,既为队尾 -
bool empty(); //判断队列是否为空
因为数据全是存储在Save中,所以队列的数据状态与Save一致,返回Save.empty(); -
int size(); //返回队列的个数
同empty一样,直接返回Save.size(); -
int front(); //返回第一个元素
将Save里的数据全部转移到Temp中,再记录一个局部变量t,记录Temp中的队顶,此时的队顶即为Save的队首,而Save的队首即为队列的队头,然后再将Temp中的元素清空转移回Save中 -
void pop(); //删除第一个元素
同front类似,将Save中的元素转移至Temp中后,删除Temp的队顶元素,再将Save中的元素转移回去
代码如下:
//实现的头文件
#pragma once
#include <stack>
#include <iostream>
using namespace std;
class Queue
{
public:
Queue();
~Queue();
void push(int n); //在末尾加入一个元素
int back(); //返回最后一个元素
bool empty(); //判断队列是否为空
int front(); //返回第一个元素
void pop(); //删除第一个元素
int size(); //返回队列的个数
private:
stack<int> Save;
stack<int> Temp;
};
//cpp实现
#include "Queue.h"
Queue::Queue()
{
}
Queue::~Queue()
{
}
void Queue::push(int n)
{
Save.push(n);
}
int Queue::back()
{
return Save.top();
}
bool Queue::empty()
{
return Save.empty();
}
int Queue::front()
{
while (!Save.empty())
{
Temp.push(Save.top());
Save.pop();
}
int t = Temp.top(); //记录Temp中的队顶元素
while (!Temp.empty())
{
Save.push(Temp.top());
Temp.pop();
}
return t;
}
void Queue::pop()
{
while (!Save.empty())
{
Temp.push(Save.top());
Save.pop();
}
Temp.pop(); //删除Temp的队顶元素
while (!Temp.empty())
{
Save.push(Temp.top());
Temp.pop();
}
}
int Queue::size()
{
return Save.size();
}
#include <iostream>
#include "Queue.h"
using namespace std;
int main()
{
Queue Que;
for (int i = 1; i <= 10; i++)
{
Que.push(i);
}
cout << Que.front() << endl;
cout << Que.size() << endl;
cout << Que.back() << endl;
while (!Que.empty())
{
cout << Que.front() << " ";
Que.pop();
}
cout << endl;
return 0;
}
运行结果如图: