剑指Offer 09. 用两个栈实现队列
题目描述

思路
看题目没看懂,只看懂用两个栈实现一个队列。队列和栈是特殊的线性表,都有什么特征呢?
- 栈:先进后出
- 队列:先进先出
再复习一下C++里面栈(stack)和队列(queue)分别拥有的函数吧
- stack
- empty() 堆栈为空则返回真
- pop() 移除栈顶元素
- push() 在栈顶增加元素
- size() 返回栈中元素数目
- top() 返回栈顶元素
- queue
- front() 返回队首元素引用
- back() 返回队尾元素引用
- push() 在队列尾部增加元素
- pop() 删除队首元素
- size() 返回队列元素个数
- empty() 队列为空则返回true
- emplace()
- swap(queue<T> &other_q)
队列的目前用不着,先熟悉stack。由此,这道题的思路就是:
- 创建两个栈,一个栈stack1用来实现队尾加入元素,一个栈stack2用来实现队头出元素.
- 加入一个元素:直接push到stack1中;
- 出一个元素:先将stack1中的元素一个一个出栈到stack2,这样原来stack1栈底的元素就会变成stack2的栈顶元素,也是队列中的第一个元素,将其出栈。出完栈之后再把stack2中的元素重新push到stack1.
代码
class CQueue { public: stack<int> stack1; stack<int> stack2; CQueue() { } void appendTail(int value) { stack1.push(value); } int deleteHead() { int res; if(stack1.empty()){ return -1; }else{ while(!stack1.empty()){ int tmp=stack1.top(); stack1.pop(); stack2.push(tmp); } res=stack2.top(); stack2.pop(); while(!stack2.empty()){ int tmp=stack2.top(); stack2.pop(); stack1.push(tmp); } } return res; } }; /** * Your CQueue object will be instantiated and called as such: * CQueue* obj = new CQueue(); * obj->appendTail(value); * int param_2 = obj->deleteHead(); */
总结

算法效率有问题,太差了。
浙公网安备 33010602011771号