剑指offer 09.用两个栈实现队列
题目链接(力扣):https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/
题意:用两个栈模仿队列的插入和删除两个动作最终呈现的效果。
分析:输入输出中,操作与输出一一对应,只有CQueue和appendTail会对应null,deleteHead会对应一个数,这个数是输入数据和-1的二者其一。所以只需要deleteHead函数有返回值,CQueue和appendTail函数不需要返回值(即输出对应为null)。
用两个栈模仿队列,第一个栈负责正常入队,出队时为了保证先进先出的顺序,需要把第一个栈中的内容倒置,即第二个栈的作用。调用deleteHead函数时,需要将栈一中的元素全部一一弹出,并逐个压入栈二,此时再从栈二弹出的元素,即为队列弹出队头时应输出的元素。再输入数据时,就再压入栈一,需要输出时,就再将栈一的元素转移到栈二,接着弹出,循环操作即可。
代码:
class CQueue { stack<int> stack1,stack2; public: CQueue() { while(!stack1.empty()){ stack1.pop(); } while(!stack2.empty()){ stack2.pop(); } } void appendTail(int value) { stack1.push(value); } int deleteHead() { if(stack2.empty()){ while(!stack1.empty()){ stack2.push(stack1.top()); stack1.pop(); } } if(stack2.empty()){ return -1; }else{ int deleteItem=stack2.top(); stack2.pop(); return deleteItem; } } };
小结:这个题不像之前比赛中的题,这种题提供基本的框架,不写输入输出语句,所以乍一上手比较懵,也不知道系统负责处理哪些部分,自己需要写哪些部分。没有之前整体的连贯感,但是这个题就是考基本的数据结构知识点的掌握,有点像学校的考试,需要完成的部分就是填写函数中的内容。

浙公网安备 33010602011771号