用栈实现队列
使用栈实现队列的下列操作:
- push(x): 将一个元素放入队列的尾部
- pop(): 从队列首部移除元素
- peek(): 返回队列首部的元素
- empty(): 返回队列是否为空
示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:
- 你只能使用标准的栈操作:也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的
- 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可
- 假设所有操作都是有效的(例如,一个空的队列不会调用 pop 或者 peek 操作)
个人理解:
栈是后入先出,用两个后入先出实现一个先入先出,那很简单了,负负得正。
我们定义两个栈,一个栈用来输入数据,一个栈用来输出数据,在输出栈为空的时候,把输入栈内容推到输出栈就行,这样数据就反向了。实现了队列效果。
代码如下(C++):
class MyQueue {
public:
stack<int> inStack; // 定义输入栈
stack<int> outStack; // 定义输出栈
/** 检查方法 */
void check(){ // 检查输出栈是否有数据,没有的话,就把输入栈缓存的弄进来
if(outStack.empty()){
while(!inStack.empty()){
outStack.push(inStack.top());
inStack.pop();
}
}
}
/** 在此初始化数据结构 */
MyQueue() {
}
/** push方法,直接在inStack中推入 */
void push(int x) {
inStack.push(x); // 将数据推入输入栈
}
/** 从队列前面删除该元素并返回该元素 */
int pop() {
check(); // 检查栈元素
int a = outStack.top(); // 获取输出栈顶部元素
outStack.pop(); // 推出元素
return a;
}
/** 获取顶峰元素 */
int peek() {
check(); // 检查栈元素
return outStack.top(); // 获取输出栈的顶部元素
}
/** 返回队列是否为空 */
bool empty() {
return inStack.empty() && outStack.empty(); // 输入输出均为空即可
}
};
放在最后
如果您喜欢我的文章,拜托点赞+收藏+关注,博主会根据大家喜好来推出相关系列文章~
更多精彩内容也可以访问我的博客Aelous-BLog