今天學了一波數據結構,看到一段非常神奇的代碼,於是模仿了一下。
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());
}
}
}