设计包含min函数的栈[数据结构]
来源:互联网 发布:java课程设计 编辑:程序博客网 时间:2024/05/22 12:08
分析:这是去年google的一道面试题。
我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。
在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则更新最小元素。
乍一看这样思路挺好的。但仔细一想,该思路存在一个重要的问题:如果当前最小元素被pop出去,如何才能得到下一个最小元素?
因此仅仅只添加一个成员变量存放最小元素(或最小元素的位置)是不够的。我们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
参考地址:http://zhedahht.blog.163.com/blog/static/25411174200712895228171/
以下为该题目的java实现,用LinkedList实现栈
import java.util.LinkedList;import java.util.Stack;
public class Test_02 {
public static void main(String[] args) { NewStack ns = new NewStack(); ns.push(1); System.out.println(ns.min()); ns.push(3); System.out.println(ns.min()); ns.push(2); System.out.println(ns.min()); /*ns.pop(); System.out.println(ns.min()); ns.push(1); System.out.println(ns.min()); ns.pop(); System.out.println(ns.min()); ns.pop(); System.out.println(ns.min());*/ }
}class NewStack{ private LinkedList<Integer> datalist = new LinkedList<Integer>();//数据链表,存放数据 private LinkedList<Integer> helplist = new LinkedList<Integer>();//辅助链表,存放最小值在数据栈中的下标 //int index=0; public void push(int n){ if(datalist.size()==0){ datalist.add(n); helplist.add(0); //index =0; } else{ if(n<datalist.get(helplist.getLast())){ datalist.add(n); helplist.add(datalist.size()-1); } else { datalist.add(n); helplist.add(helplist.getLast()); } } } public Integer pop(){ if(datalist.size()==0){ System.out.println("所有数据都已出栈"); return null; } helplist.removeLast(); return datalist.removeLast(); } Integer min(){ if(datalist.size()==0){ System.out.println("栈中已无数据"); return null; } return datalist.get(helplist.getLast()); }}
运行测试结果为:
1
1
1
- 设计包含min函数的栈[数据结构]
- 设计包含min函数的栈[数据结构]
- 设计包含min函数的栈[数据结构]
- 设计包含min函数的栈[数据结构]
- 解题笔记-设计包含min函数的栈[数据结构]
- 数据结构与算法-设计包含min函数的栈
- 包含min函数的栈[数据结构]
- 【数据结构】包含min函数的栈
- 数据结构面试题1.2.3-设计包含min函数的栈[数据结构]
- 设计包含min函数的栈
- 设计包含min函数的栈
- 转载 设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含 min 函数的栈
- 设计包含min函数的栈
- 2.设计包含min函数的栈
- 2、设计包含min 函数的栈
- 图表中有规律的刻度是如何实现的?
- 1500. Prime Gap(用筛法预处理出素数数组,然后再处理)
- 1515.魔板C
- 1532. Binary Search
- ubuntu右键在当前位置打开终端
- 设计包含min函数的栈[数据结构]
- 1782. Knapsack(动态)
- 1813. M进制数问题(M进制先转成10进制,操作完后再转M进制)
- 1935. 二叉树重建(根据先序遍历和中序遍历重建二叉树并进行广度优先遍历)
- 结构体数组在ARM2440经典用法
- 1940. Ordering Tasks(拓扑排序,用set装住入度为0的点)
- 软件需求分析
- 组件连接/绑定中“->”、“<-”与“=”的区别
- BlackBerry10 Cascades之DockLayout