由两个栈组成的队列
一、题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
leetcode:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/
二、实现思路
- 两个栈,一个栈 A 只用来进元素,一个栈 B 只用来出元素
- 进的时候,只通过栈 A。出的时候
- 如果栈 B 没有元素,则先将栈 A 的元素全部进到栈 B 中,然后再从栈 B 中出。
- 如果栈 B 有元素,直接从栈 B 出
三、代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <stack> #include <iostream>
class CQueue { public: CQueue() {
}
void appendTail(int value) { push_stack_.push(value); }
int deleteHead() { if (pop_stack_.empty() && push_stack_.empty()) { return -1; } if (pop_stack_.empty()) { while (!push_stack_.empty()) { pop_stack_.push(push_stack_.top()); push_stack_.pop(); } } int val = pop_stack_.top(); pop_stack_.pop(); return val; }
private: std::stack<int> push_stack_; std::stack<int> pop_stack_; };
int main() { CQueue c; std::cout << c.deleteHead() << std::endl; c.appendTail(5); c.appendTail(2); std::cout << c.deleteHead() << std::endl; std::cout << c.deleteHead() << std::endl; }
|
- 时间复杂度, appendTail: O(1),deleteHead:O(n)
- 空间复杂度:O(n)