SDUT 3333寻找下一最大值(栈的应用)

导读:本篇文章讲解 SDUT 3333寻找下一最大值(栈的应用),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目描述

数据结构实验之栈与队列六:下一较大值(二)
Time Limit: 150 ms Memory Limit: 8000 KiB
Submit Statistic Discuss
Problem Description

对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。
Input

输入有多组,第一行输入t(1<=t<=10),表示输入的组数;
以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。
Output

输出有多组,每组之间输出一个空行(最后一组之后没有);
每组输出按照本序列元素的顺序,依次逐行输出当前元素及其查找结果,两者之间以–>间隔。
Sample Input

2
4 12 20 15 18
5 20 15 25 30 6
Sample Output

12–>20
20–>-1
15–>18
18–>-1

20–>25
15–>25
25–>30
30–>-1
6–>-1

代码 & 分析

很容易想到最直接的方法,当时题目中注明了数据量很大,因此借助栈来实现,主要思想就是第一个数字直接入栈,其他的数字先对栈顶的数字进行比较,如果大于栈顶元素的值的话,说明栈顶元素的下一最大值已经找到,记录下来,然后出栈就可以了,也就是说,对于每个输入的数字,是从它前一个数字开始向前比较的,因此得到的就是离之前的数字的最近的最大值:

#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<iostream>
using namespace std;

struct node{      //用来记录每个数字的值以及下一最大值,为了方便取值 定义了id
    int id;
    int a;
    int next;
};

node s[1000000];
int main(){
    int n;
    cin>>n;
    while(n--){
        int m;
        stack<node> st;
        cin>>m;
        for(int i=0; i<m; i++){
            cin>>s[i].a;
            s[i].id = i;
            s[i].next = -1;             //对每个数初始化

            if(st.empty()){              //如果栈空,那么这个数字之前没有数字也就不用找离它最近的小于它的数字了
                st.push(s[i]);
            }
            else{
                while(!st.empty()){    //循环寻找 因为一个数字可能是多个数字的最近较大值
                    if(s[i].a > st.top().a){
                        s[st.top().id].next = s[i].a;
                        st.pop();
                    }
                    else{
                        break;
                    }
                }
                st.push(s[i]);
            }
        }
        for(int i=0; i<m; i++){
            cout<<s[i].a<<"-->"<<s[i].next<<endl;
        }
        cout<<endl;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/116790.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!