剑指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;
        }
    }
};

小结:这个题不像之前比赛中的题,这种题提供基本的框架,不写输入输出语句,所以乍一上手比较懵,也不知道系统负责处理哪些部分,自己需要写哪些部分。没有之前整体的连贯感,但是这个题就是考基本的数据结构知识点的掌握,有点像学校的考试,需要完成的部分就是填写函数中的内容。

posted @ 2022-02-21 23:04  ogada_567  阅读(60)  评论(0)    收藏  举报