今天学了一波数据结构,看到一段非常神奇的代码,于是模仿了一下。
package big;
/**
* 一个大顶堆
* @author hanhe
*
*/
public class Stack {
int size;
int data[];
int maxSize;
public Stack()
{
maxSize=50;
size=0;
data=new int[maxSize];
data[0]=Integer.MAX_VALUE;
}
public Stack(int maxSize)
{
this.maxSize=maxSize;
size=0;
data=new int[maxSize];
data[0]=Integer.MAX_VALUE;
}
/**
* 判断当前堆是否为空
* @return 为空时返回true,否则返回false
*/
public boolean isEmpty()
{
if(size==0)
return true;
return false;
}
public boolean isFull()
{
if(size==maxSize)
return true;
return false;
}
/**
* 插入一个值
* @param value
*/
public void insert(int value)
{
if(isFull())
return;
int i=(++size);
for(;value>data[(int)(i/2)];i/=2)
{
data[i]=data[(int)(i/2)];
}
data[i]=value;
}
/**
* 取出最大值
* @return 返回当前堆内的最大值
*/
public int deleteMax()
{
if(this.isEmpty())
return -1;
int parent,child;
int maxItem,temp;
//数组中的第一个值是当前堆内的最大值
maxItem=this.data[1];
//tmp保存当前堆内的之后一个值
temp=this.data[this.size--];
/*
*以下是这段代码的精华部分,用精妙的代码完成大顶堆的转换
*/
//parent>=size时,说明当前节点已没有子树
for(parent=1;parent*2<=this.size;parent=child)
{
//使child指向左子树
child=parent*2;
//如果左子树等于size说明不存在右子树,如果右子树的值大于左子树的值则让child指向右子树
if((child!=this.size) && this.data[child]<this.data[child+1])
child++;
//如果最后一个节点的值大于子树的值则移动完成,否则用子树的值作为堆顶,将最后的值,与子树的值交换
if(temp>=this.data[child]) break;
else
this.data[parent]=this.data[child];
}
//将最后的值放到指定位置
this.data[parent]=temp;
return maxItem;
}
public void dfs(int n)
{
if(n>size)
return;
System.out.println(data[n]);
dfs(n*2);
dfs(n*2+1);
}
public void print()
{
for(int i=1;i<=size;++i)
System.out.print(data[i]+" ");
System.out.println();
}
public static void main(String args[])
{
Stack s=new Stack();
s.insert(10);
s.insert(15);
s.insert(4);
while(!s.isEmpty())
{
System.out.println(s.deleteMax());
}
}
}