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

题目描述

数据结构实验之栈与队列六:下一较大值(二)
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;
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_34328764/article/details/80274033