用队列实现栈
使用队列实现栈的下列操作:
- push(x): 元素 x 入栈
- pop(): 移除栈顶元素
- top(): 获取栈顶元素
- empty(): 返回栈是否为空
注意:
- 你只能使用队列的基本操作:也就是 push to back,peek/pop from front,size,和 is empty 这些操作是合法的
- 你所使用的语言也许不支持队列。你可以使用 list 或者 deque(双端队列)来模拟一个队列,只要是标准的队列操作即可
- 你可以假设所有操作都是有效的(例如,对一个空的栈不会调用 pop 或者 top 操作)
个人理解:
这个和上面的栈实现队列有异曲同工之妙,但是稍有不同。两个队列实现栈,相当于两个正向,想要实现一个反向,正正肯定是不能得负的。
所以我们需要换一种想法,定义两个队列,输入一个数组,进入输入队列,然后将输入队列放到输出队列中,输入清空。
再来一个数字,将输出队列的数据放到输入中,实现反向,再重复步骤即可。
代码如下(C++):
class MyStack {
public:
queue<int> inQueue; // 输入队列
queue<int> outQueue; // 输出队列
/** 初始化数据结构 */
MyStack() {
}
/** 把值推入栈 */
void push(int x) {
inQueue.push(x); // 将一个值推进输入队列
while(!outQueue.empty()){ // 把输出队列中的给输入队列
inQueue.push(outQueue.front());
outQueue.pop();
}
queue<int> tmp = inQueue; // 再把输入队列的还给输出队列
inQueue = outQueue;
outQueue = tmp;
// while(!inQueue.empty()){ // 再把输入队列的还给输出队列
// outQueue.push(inQueue.front());
// inQueue.pop();
// }
}
/** 移除栈顶元素 */
int pop() {
if(outQueue.empty()){ // 输出队列为空,return 0
return 0;
}
int a = outQueue.front(); // 获取顶部
outQueue.pop(); // 输出队列推出
return a;
}
/** 获取栈顶元素 */
int top() {
if(outQueue.empty()){ //输出队列为空,return 0
return 0;
}
return outQueue.front(); // 获取输出队列顶部
}
/** 查看队列是否为空 */
bool empty() {
return outQueue.empty(); // 判断输入队列是否为空
}
};
放在最后
如果您喜欢我的文章,拜托点赞+收藏+关注,博主会根据大家喜好来推出相关系列文章~
更多精彩内容也可以访问我的博客Aelous-BLog