3.4 亲兄弟问题

数据结构与算法实验题 3.4 亲兄弟问题

实验任务

  给定 n 个整数 A0,A1,…An-1 组成的序列。序列中元素 Ai的亲兄弟 Ak定义为 Ai 的右边最靠近它且不小于它的元素,即 k=min{ j | Aj >= Ai } ( i < j < n)。

  亲兄弟问题要求给定序列中每个元素的亲兄弟元素的位置。元素 Ai的亲兄弟元素为 Ak时,称 k 为元素 Ai 的亲兄弟元素的位置。当元素 Ai没有亲兄弟元素时,约定其亲兄弟元素的位置为-1。

  例如,当 n=10,整数序列为 6,1,4,3,6,2,4,7,3,5 时,相应的亲兄弟元素位置序列为4,2,4,4,7,6,7,-1,9,-1。

  现在对于给定的n个整数A0,A1,…,An-1组成的序列,求出相应的亲兄弟元素位置序列。

数据输入

输入数据有两行。

第一行是一个数 n(1 <= n <= 600000),表示给定 n 个整数。

第二行是 0 <= A0,A1,…,An-1 <= 100000。

数据输出

输出计算出的与给定序列相应的亲兄弟元素位置序列。

输入示例

10
6 1 4 3 6 2 4 7 3 5 |

输出示例

4 2 4 4 7 6 7 -1 9 -1

参考代码

C++代码

#include 
#include  
// 单调递增栈
int main(void)
{
	int size,n;
	
	scanf("%d", &size);
	std::stack<int> S;
	int data[size],position[size];
	
	for(n=0;n<size;n++)
		scanf("%d", &data[n]);
	
	for(n=0;n<size;n++)
	{
		while(!S.empty()&&data[S.top()]<=data[n])
		{
			position[S.top()]=n;
			S.pop();			
		}
		S.push(n);
	}
	while(!S.empty())
	{
		position[S.top()]=-1;
		S.pop();		
	}
	
	for(n=0;n<size;n++)
		printf("%d ", position[n]);
	
	return 0;
}

C代码

#include 
#include 
#define none -1
typedef struct astack *Stack;
typedef struct astack{
	int top,maxsize;
	int *data;
}stack;

Stack StackInit(int size)
{
	Stack S=(Stack)malloc(sizeof(stack));
	S->data=(int *)malloc(sizeof(int)*size);
	S->maxsize=size;
	S->top=-1;
	
	return S;
}

int StackEmpty(Stack S)
{
	return S->top==-1;
}

int StackFull(Stack S)
{
	return S->top==S->maxsize;
}

void StackPush(Stack S,int x)
{
	if(StackFull(S))
		return ;
	else
		S->data[++S->top]=x;
}

int StackPop(Stack S)
{
	if(StackEmpty(S))
		return none;
	else
		return S->data[S->top--];
}

int StackTop(Stack S)
{
	return S->data[S->top];
}

int main(void)
{
	int size,n;
	
	scanf("%d", &size);
	Stack S=StackInit(size);
	int *data=(int *)malloc(sizeof(int)*size);
	int *position=(int *)malloc(sizeof(int)*size);
	
	for(n=0;n<size;n++)
		scanf("%d", &data[n]);
	
	for(n=0;n<size;n++)
	{
		while(!StackEmpty(S)&&data[StackTop(S)]<=data[n])
			position[StackPop(S)]=n;
		StackPush(S,n);
	}
	while(!StackEmpty(S))
		position[StackPop(S)]=-1;
	
	for(n=0;n<size;n++)
		printf("%d ", position[n]);
	
	return 0;
}

你可能感兴趣的:(算法题,算法,c++,数据结构)