题目
请你设计一个支持下述操作的栈。
实现自定义栈类 CustomStack :
CustomStack(int maxSize)
:用maxSize
初始化对象,maxSize
是栈中最多能容纳的元素数量,栈在增长到maxSize
之后则不支持push
操作。void push(int x)
:如果栈还未增长到maxSize
,就将x
添加到栈顶。int pop()
:弹出栈顶元素,并返回栈顶的值,或栈为空时返回 -1 。void inc(int k, int val)
:栈底的k
个元素的值都增加val
。如果栈中元素总数小于k
,则栈中的所有元素都增加val
。
解答
class CustomStack {private int maxSize = 0;private LinkedList<Integer> stack = new LinkedList<>();public CustomStack(int maxSize) {this.maxSize = maxSize;}public void push(int x) {if (stack.size() >= maxSize) {return;}stack.addLast(x);;}public int pop() {if (stack.isEmpty()) {return -1;}return stack.removeLast();}public void increment(int k, int val) {int count = stack.size();if (count > k) {count = k;}for (int i = 0; i < count; ++i) {int value = stack.get(i);value += val;stack.set(i, value);}}
}
要点
本题目实现的难度不大,只需要了解栈的基本定义,即可输出符合题目要求的代码,唯一的问题在于如何保证increment
方法的运行效率。
当前给出的实现方案,基于LinkedList
来存储数据,在列表的末尾增加或者删除元素,支持push
和pop
方法不是问题,时间复杂度均为O(1),这是由LinkedList
实现特点保证的。
基于下标获取链表某指定元素的操作,时间复杂度为O(N),这是链表的特点决定的,和LinkedList
的实现无关,因此在支持increment
方法时效率比较低,因为每次均需要从头部开始扫描元素,才能得到指定位置的元素。