题目原文:

Stack with max. Create a data structure that efficiently supports the stack operations (push and pop) and also a return-the-maximum operation. Assume the elements are reals numbers so that you can compare them.

分析:

该题目要求在实现正常stack的push和pop操作外,还需要实现返回maximum的操作,显然一个数组是不够的,需要额外的数组maximums[]来从小到大存储stack内的值,每次返回maximum就返回maximums[n-1],可满足要求。

 import java.util.Arrays;

 /**
* @author evasean www.cnblogs.com/evasean/
*/
public class StackWithMax {
public double[] items;// 为了方便展示结果,我也懒得写遍历方法,就设为public
public double[] maximums; // 存放最大值的数组,为了方便展示结果,我也懒得写遍历方法,就设为public
private int n;
private int cap; public StackWithMax() {
n = 0;
cap = 2;
items = new double[cap];
maximums = new double[cap];
} public boolean isEmpty() {
return n == 0;
} public void push(double item) {
if (n == 0)
maximums[0] = item;
else {
int i;
int j;
for (i = n - 1; i >= 0; i--) {// 这个循环用来找出item在maximums数组中应该放置的位置
if (item <= maximums[i])
continue;
else
break;
}
for (j = n - 1; j > i; j--) {// 将位置i以后的元素都往后挪一个位置
maximums[j + 1] = maximums[j];
} // 循环结束时j指向i
maximums[j + 1] = item;// j+1就是item应该放置的位置
}
items[n++] = item;
if (n == cap)
resize(2 * cap);
} public double pop() {
double item = items[--n];
if (n > 0 && n == cap / 4)
resize(cap / 2);
return item;
} public double maximum() {
return maximums[n - 1];
} private void resize(int cap) {
double[] t1 = new double[cap];
double[] t2 = new double[cap];
for (int i = 0; i < n; i++) {
t1[i] = items[i];
t2[i] = maximums[i];
}
items = t1;
maximums = t2;
this.cap = cap;
} public static void main(String[] args) {
StackWithMax stack = new StackWithMax();
stack.push(9);
stack.push(8);
stack.push(11);
stack.push(0);
stack.push(-9.9);
stack.push(88);
System.out.println(Arrays.toString(stack.items));
System.out.println(Arrays.toString(stack.maximums));
stack.pop();
System.out.println(stack.maximum());
}
}

最新文章

  1. .net core
  2. inflate的基本用法,类似于findviewbyId
  3. 项目管理知识框架PMBOK(文字版)
  4. .NET 产品版权保护方案 (.NET源码加密保护) (转载)
  5. Caused by: org.hibernate.HibernateException: Connection cannot be null when &#39;hibernate.dialect&#39; not set
  6. 阿里云大数据三次技术突围:Greenplum、Hadoop和“飞天”
  7. 《剑指Offer》之二维数组中的查找
  8. 最简单的视音频播放示例3:Direct3D播放YUV,RGB(通过Surface)
  9. mem 族函数的实现
  10. (转载)PHP静态方法
  11. python-打印简单公司员工信息表
  12. PCB抄板评估需要关注的因素
  13. VS2010对C++11的支持列表(感觉大部分都不支持)
  14. mac 安装mysqldb组件包及mac中安装mysql-python遇到的问题
  15. Struts2国际化信息机制
  16. Hibernate 实体映射类的状态值自动转换
  17. Mysql数据库的触发程序
  18. laravel 远程一对多实例
  19. Gradle缓存目录文件命名规则
  20. 《大话设计模式》c++实现 状态模式

热门文章

  1. 从CSDN转到cnblogs了
  2. mvc EF 出现异常, 能提示出那个字段出现问题
  3. ionic4封装样式原理
  4. csrf漏洞利用
  5. chrome浏览器处理本地Ajax跨域
  6. Oracle行转列/列转行
  7. BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列
  8. 内核调试-perf introduction
  9. 好用的JS数字格式化
  10. OprenCV学习之路一:将彩色图片转换成灰度图