【データ構造とアルゴリズム】二叉スタック


コアオペレーションはsift_up,sift_down、他のすべての操作はこの2つのコア操作に基づいて構築されており、実際にはすべてのスタック構造がこの2つの操作を使用することができます.
const int maxsize = 10001;
int size = 0;
int min_heap[maxsize];/*0      ,      0  , k/2        */


void sift_up(int k)//  k     ,      
{
	int tmp = min_heap[k];
	for(; k>1;k=k>>1 )/*       ,     k              */
	{
		if(tmp < min_heap[k>>1])
			min_heap[k] = min_heap[k>>1];
		else break;
	}
	min_heap[k] = tmp;
}


void sift_down(int k)//  k     ,      
{
	int tmp = min_heap[k];
	for(k=k<<1; k<=size; k=k<<1)/*          ,  k    k>>1             */
	{
		if(k+1<=size && min_heap[k+1] < min_heap[k])/*       */
			++k;		
		if(tmp > min_heap[k])
			min_heap[k>>1] = min_heap[k];
		else	break;		
	}
	min_heap[k>>1] = tmp;
}


/*  */
void push(int x)/*    x*/
{
	min_heap[++size] = x;
	sift_up(size);
}

/*  */
/******
       pop                 ,
         ,  pop          
*******/

void pop(int k=1)/*    k     ,1     */
{
	min_heap[k] = min_heap[size--];/*      k  */
	sift_up(k);
	sift_down(k);
}
int getTop()
{
	int top = min_heap[1];
	pop(1);
	return top;
}
/*  */
void update(int k,int x)/*  k            x*/
{
	min_heap[k] = x;
	sift_up(k);
	sift_down(k);
}