【程序员面试金典】面试题 03.03. 堆盘子

【程序员面试金典】面试题 03.03. 堆盘子

题目描述

描述:堆盘子。设想有一堆盘子,堆太高可能会倒下来。因此,在现实生活中,盘子堆到一定高度时,我们就会另外堆一堆盘子。请实现数据结构SetOfStacks,模拟这种行为。SetOfStacks应该由多个栈组成,并且在前一个栈填满时新建一个栈。此外,SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同(也就是说,pop()返回的值,应该跟只有一个栈时的情况一样)。 进阶:实现一个popAt(int index)方法,根据指定的子栈,执行pop操作。

当某个栈为空时,应当删除该栈。当栈中没有元素或不存在该栈时,pop,popAt 应返回 -1.

 输入:
["StackOfPlates", "push", "push", "popAt", "pop", "pop"]
[[1], [1], [2], [1], [], []]
 输出:
[null, null, null, 2, 1, -1]
输入:
["StackOfPlates", "push", "push", "push", "popAt", "popAt", "popAt"]
[[2], [1], [2], [3], [0], [0], [0]]
 输出:
[null, null, null, null, 2, 1, 3]

解题思路

思路1:最直观的想法是,使用vector<stack<int>>存储栈元素。当栈元素数组为空或者最后一个栈元素已满则需要创建新栈并插入到数组尾部,当最后一个栈元素未满则插入元素;当栈元素数组不为空且最后一个栈元素不为空则弹出元素,当最后一个栈元素弹出元素后变为空则将其移出数组;当给定index合法且对应下标的栈元素不为空时,则从其弹出元素,当下标为index的栈元素弹出元素后变为空则将其移出数组。

vector<stack<int>> sts;
    int stSize;
    StackOfPlates(int cap) {
        stSize=cap;
    }
    
    void push(int val) {
        // 没有栈 或者最后一个栈已满 创建新栈
        if(sts.empty()||sts.back().size()==stSize)
        {
            stack<int> st;
            sts.push_back(st);
        }
        // 栈尾元素未满则插入元素
        if(sts.back().size()<stSize)
            sts.back().push(val);    
    }
    
    int pop() {
        int res=-1;
        if(!sts.empty()&&sts.back().size()>0)
        {
            res=sts.back().top();
            sts.back().pop();
            // 最后一个栈元素为空删除
            if(sts.back().empty())
                sts.pop_back();
        }         
        return res;
    }
    
    int popAt(int index) {
        int res=-1;
        // 合法index
        if(!sts.empty()&&index>=0&&index<sts.size()&&!sts[index].empty())
        {
            res=sts[index].top();
            sts[index].pop();
            // 该栈元素为空
            if(sts[index].empty())
                sts.erase(sts.begin()+index);
        }
        return res;
    }

总结:第一眼,哎,怎么都读不懂题目示例意思啊!题目要求一个栈到达指定元素后需要重新创建栈,一个栈删除元素变为空后需要删除栈,我还在想使用什么数据结构呢?使用vector<stack<int>>啊!

 输入:
["StackOfPlates", "push", "push", "push", "popAt", "popAt", "popAt"]
[[2], [1], [2], [3], [0], [0], [0]]
 输出:
[null, null, null, null, 2, 1, 3]

// StackOfPlates [2] 表示栈的大小
// push [1] 压入元素1
// push [2] 压入元素2
// push [3] 压入元素3  此时需要重新创建一个栈
// popAt [0] 在第一个栈删除元素 返回被删除值2
// popAt [0] 在第一个栈删除元素 返回被删除值1 此时第一个栈被删除
// popAt [0] 在第一个栈删除元素 返回被删除值3
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值