我是入门菜勾 2023-03-22 12:06 采纳率: 85.7%
浏览 42
已结题

给定一个数组,对于每个元素,找到它右边第一个比它大的元素C语言单向栈

#include <stdio.h>
#include <stdlib.h>
#define N 10000
typedef int datatype;
typedef struct link stack;
struct link {
    int top;
    int data[N];
};
void push(stack *st,datatype x);
void pop(stack *st);
int main() {
    int i,j,k,n;
    int a[N];
    stack *st;
    scanf("%d",&n);
    for(i=1; i<=n; i++) {
        scanf("%d",&a[i]);
    }
    st=(stack*)malloc(sizeof(stack));
    st->top=0;
    i=1,j=i+1;
    while(i<N) {
        if(a[i]>a[j]) {
            push(st,a[j]);
            i++;
            j++;
        }else{
            st->data[1]=a[j];
            pop(st);
        }
    }
    return 0;
}
void push(stack *st,datatype x) {
    if(st->top==N) {
        printf("\n栈满");
        exit(1);
    }
    st->data[st->top]=x;
    st->top++;
}
void pop(stack *st) {
    if(st->top==0) {
        printf("\n栈空");
        exit(1);
    }
    st->top--;
}

刚学数据结构没思路

  • 写回答

2条回答 默认 最新

  • 啊猪是的读来过倒 2023-03-22 12:18
    关注

    使用单调栈算法解决,单调栈算法的基本思想是维护一个递减的栈,每当新元素加入栈时,将栈中所有小于该元素的元素弹出栈,然后将该元素入栈。这样可以保证栈中元素的递减性质。对于每个元素,找到它右边第一个比它大的元素,可以从右往左扫描数组,维护一个单调栈,栈中存储数组的下标,每次加入新的元素时,如果栈顶元素小于当前元素,说明栈顶元素的右边第一个比它大的元素就是当前元素,将栈顶元素出栈,并记录当前元素为该下标对应的答案。最终遍历完成后,栈中剩下的元素对应的答案为-1,表示右边没有比它大的元素。
    如有帮助望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 已采纳回答 3月23日
  • 创建了问题 3月22日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来