leetcode原题:堆盘子 (考查对栈的理解和使用)

题目:

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

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

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

题目解释:

1.执行StackOfPlates(1),意思是定义每堆盘子只能存放1个盘子,无返回值,所以输出null

2.执行puhs (1),意思是堆盘子1号,无返回值,所以输出null

3.执行puhs (2),意思是堆盘子2号,此时因为前一堆盘子已经满了,需要新建一堆盘子继续堆,无返回值,所以输出null

4.执行popAt (1),意思是从下标为1的盘子堆中拿走最上面的一个盘子,这里盘子堆的下标是从0开始的,所以也就是从第二堆盘子拿,所以返回的是2

5.执行pop(),意思是从最后一堆盘子中拿走最上面的一个盘子,这里因为前一个已经将第二堆盘子清空了,所以应该从第一堆盘子中拿,所以返回的是1

6.执行pop(),意思是从最后一堆盘子中拿走最上面的一个盘子,这里因为已经没有盘子堆了,所以无法拿盘子,返回-1

解题思路:

1.将一个个盘子堆想象成一个个栈,创建一个数组,数据类型为栈,这样就可以给每堆盘子进行编号

2.当前盘子已经堆满后,就要堆一个新的,所以要创建一个栈

3.在拿走盘子时,如果拿走之后,当前这堆盘子为空了,要将当前这个盘子堆的栈清除掉

源代码如下:

class StackOfPlates {
public:
    vector<stack<int>> ss;//定义一个数组,每个元素存放的是一个栈
    int sum;//没堆盘子的最大高度
    StackOfPlates(int cap) {
        sum=cap;
    }
    //堆盘子
    void push(int val) {
        //如果每堆盘子的最大高度为0,那么就不能堆盘子
       if(sum==0)
       {
           return;
       }
        //当前还没有堆盘子时,或者是当前的这堆盘子已经到达最大高度了
        //就要创建一个新的栈
        if(ss.empty()||ss.back().size()==sum)
        {
            ss.push_back(stack<int>());
        }
        //将盘子堆到栈中
        ss.back().push(val);
    }
    //把盘子从最后一个栈里拿出来
    int pop() {
        //如果当前数组中没有栈,或者当前栈为空,则无法从栈中将盘子取出
        if(ss.empty()||ss.back().empty())
        {
            //直接返回-1
            return -1;
		}
        //记录当前的栈顶元素
        int res=ss.back().top();
        //栈顶元素出栈
        ss.back().pop();
        //如果当前栈为空了
        if(ss.back().empty())
        {
            //把当前栈从数组中清除
            //因为这个栈就是数组的最后一个元素,所以可以直接pop_back()
            ss.pop_back();
        }
        //返回这个值
        return res;
    }
    //把盘子从下标为index的这个栈中取出
    int popAt(int index) {
        //如果当前数组中没有栈
        //如果当前下标超过栈的总数
        //如果下标为index的这个栈为空
        //以上三种情况都无法出栈,返回-1
        if(ss.empty()||index>=ss.size()||ss[index].empty())
        {
            return -1;
        }
        //记录index栈的栈顶元素
        int res=ss[index].top();
        //出栈
        ss[index].pop();
        //如果当前栈为空了
        if(ss[index].empty())
        {
            //将当前这个栈清除
            ss.erase(ss.begin()+index);
		}
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值