刷题:用两个栈实现队列和包含min函数的栈

例1

题号:剑指offer09, 难度:简单

题目描述:

 

解题思路:

学习剑指offer上的思想,模拟一下过程,假设abc三个元素插入队尾,逐个压进stack1,{a,b,c}。这时候要删除一个元素,应该删除a,但是a在栈底。所以要把stack1里的元素逐个弹出和压入stack2,{c,b,a}在stack2中,a在栈顶,删除直接弹出就可以了。a删除后,stack2里还剩下{c,b},如果还要删除的话,下一个弹出b,结果也是对的。这时候插入一个元素d,d被压入stack1,stack2里还剩下{c},下一次删除的时候把c弹出去,顺序正确。

条件是:stack2为空时候,把stack1中所有元素逐个弹出并压入stack2。如果stack1执行完这个操作后,stack2还没有元素(stack1和stack2都没有元素了),就返回-1。否则正常执行删除操作,保存stack的栈顶,然后弹出栈顶元素。返回保存的栈顶。

具体代码:

class CQueue {
    stack<int>stack1,stack2;
public:
    CQueue() {

    }
    
    void appendTail(int value) {
        stack1.push(value);
    }
    
    int deleteHead() {
        if(stack2.size() <= 0)
        {
            while(stack1.size() > 0)
            {
                int num = stack1.top();
                stack1.pop();
                stack2.push(num);
            }
        }

        if(stack2.size() == 0)
        {
            return -1;
        }

        int head = stack2.top();
        stack2.pop();

        return head;
    }
};

例2

题号:剑指offer 30, 难度:简单

题目描述:

 

解题思路:

stack1插入数据的时候,stack2插入当前的最小值。

具体代码:

class MinStack {
    stack<int>stack1,stack2;
public:
    /** initialize your data structure here. */
    MinStack() {

    }
    
    void push(int x) {
        stack1.push(x);
        if(stack2.size() == 0 || x < stack2.top())
        {
            stack2.push(x);
        }
        else
        {
            stack2.push(stack2.top());
        }  
    }
    
    void pop() {
        assert(stack1.size() > 0 && stack2.size() > 0);
        stack1.pop();
        stack2.pop();
    }
    
    int top() {
        return stack1.top();
    }
    
    int min() {
        assert(stack1.size() > 0 && stack2.size() > 0);
        return stack2.top();
    }
};

总结

我本来设置了一个成员变量,然后用::min函数比较最小值,有些麻烦还容易错。学习题解里的直接跟stack2栈顶比较,是不是最小值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值