【1 day】C++算法练习 剑指Offer 09 30

1.剑指Offer 09 用栈实现队列

用两个栈实现一个队列,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

解题思路:此时建立一个A栈和B栈,把A当做一个队列,栈顶为队尾,栈底为队顶,当数据要入队时,可以直接入A栈,当要删除队首时,就需要把A栈中的数据 全部转移到B栈当中,再删除B栈顶数据。

class CQueue {
public:
    //建立一个A栈和B栈
    stack<int> A ,B;
    CQueue() {}
    
    //队尾数据直接入A栈
    void appendTail(int value) {
        A.push(value);
    }
    
    //删除队首数据
    /*
    	当删除队首数据时,会遇到三种情况
    		第一是B栈不为空
    			B栈当中有数据,此时可以直接把B栈的栈顶数据读取返回,并
    			出栈。因为A栈中的数据是倒序进入B栈的,此时B栈栈顶的数值
    			就是队列的队首数据
    		第二是A栈为空
    			直接返回-1,因为队列当中没有数值
    		第三种A栈有数据,但是B栈为空
    			此时就需要把A栈中的数据倒序进入B栈,这样队列的队首数据
    			变成了B栈的栈顶数据。
    */
    int deleteHead() {
        int temp;
        if(!B.empty()){
            temp = B.top();//B栈顶部数据读取
            B.pop();//B栈的顶部数据出栈
            return temp;
        }
        if(!A.empty()){//A栈不为空的情况
            while(!A.empty()){//A栈中的数据倒序放进B栈
                temp = A.top();//读取栈顶数据
                B.push(temp);
                A.pop();
            }
        }else{//A栈为空的情况
            return -1;
        }
        temp = B.top();
        B.pop();
        return temp;
    }
};
2.剑指Offer 30 包含main函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

解题思路:建立A栈和B栈,A栈进行正常操作而B栈作为一个辅助栈,第一个数据A栈和B栈都要入栈,从第二个数据开始,A栈依旧正常入栈,而对于辅助栈B栈来说,第二个数据要和此时B栈的栈顶数据进行比较,如果比栈顶数据小就进栈,如果不小就放弃进入辅助栈,以此往复。这样A栈的数据是正常进栈的,而B栈的栈顶元素一直是当前最小值。

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> A ,B;
    MinStack() {}
    void push(int x) {
        A.push(x);
        /*
        if(B.top()>=x || B.empty())  错误
        此处的判断条件必须是先判断B栈是否为空,否者会造成运行报错。
        报错提示为:Line 175: Char 16: runtime error: reference
        	 binding to misaligned address 0xbebebebebebec0ba for 
        	 type'int', which requires 4 byte alignment 
        原因是B栈在最开始中是为空的无法进行比较
        */
        if(B.empty() || B.top() >= x){
            B.push(x);
        }
    }
    
    void pop(){
       if(A.top() == B.top()){
       /*A栈要进行出栈操作时 要判断A栈和B栈的顶部元素数值是否相同,
       		如果相同则B栈的栈顶元素一样要出栈,要保持两者一致。
       */
            B.pop();
       }   
        A.pop();
    }
    
    int top() {
        return A.top();
    }
    
    int min() {//辅助栈B的栈顶元素一直就是最小值
        return B.top();    
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unknown To Known

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值