C语言实现给定一个数组,对于每个元素,找到它右边第一个比它大的元素
时间: 2023-05-19 19:04:47 浏览: 94
可以使用单调栈来解决这个问题。具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int value;
int index;
} Pair;
typedef struct {
Pair *data;
int top;
int size;
} Stack;
Stack *createStack(int size) {
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->data = (Pair *)malloc(sizeof(Pair) * size);
stack->top = -1;
stack->size = size;
return stack;
}
void push(Stack *stack, Pair pair) {
if (stack->top == stack->size - 1) {
return;
}
stack->top++;
stack->data[stack->top] = pair;
}
Pair pop(Stack *stack) {
if (stack->top == -1) {
Pair pair = {-1, -1};
return pair;
}
Pair pair = stack->data[stack->top];
stack->top--;
return pair;
}
void nextGreaterElement(int *nums, int numsSize, int *result) {
Stack *stack = createStack(numsSize);
for (int i = 0; i < numsSize; i++) {
Pair pair = {nums[i], i};
while (stack->top != -1 && stack->data[stack->top].value < nums[i]) {
Pair p = pop(stack);
result[p.index] = i;
}
push(stack, pair);
}
while (stack->top != -1) {
Pair p = pop(stack);
result[p.index] = -1;
}
free(stack->data);
free(stack);
}
int main() {
int nums[] = {3, 1, 4, 2};
int numsSize = sizeof(nums) / sizeof(int);
int *result = (int *)malloc(sizeof(int) * numsSize);
nextGreaterElement(nums, numsSize, result);
for (int i = 0; i < numsSize; i++) {
printf("%d ", result[i]);
}
printf("\n");
free(result);
return 0;
}
```
这个程序使用了单调栈来找到每个元素右边第一个比它大的元素。具体来说,我们从左到右遍历数组,对于每个元素,我们将它和它的下标打包成一个 Pair 结构体,然后将这个 Pair 入栈。如果栈顶元素的值比当前元素小,那么我们就弹出栈顶元素,并将它的下标作为当前元素右边第一个比它大的元素的下标。如果栈为空,说明当前元素右边没有比它大的元素,我们将它的下标设为 -1。最后,我们遍历一遍栈,将剩余的元素的下标设为 -1。
阅读全文