算法:输入一个数组,对每个元素打印第一个满足比该元素大并且在该元素后面的元素的下标,若不存在这样的元素则打印-1。

INPUT

01234567
59304569

OUTPUT 元素:5  9  3  0  4   5  6   9 下标:1 -1  4  4  5  6  7   -1

实现方法:用栈实现

步骤1:遍历所有元素做:若栈非空并且栈顶元素小于当前元素则弹出所有小于当前元素的栈内元素,并打印当前元素的下标,然后将当前元素入栈。

步骤2:若栈非空,弹出栈内所有元素并同时打印-1.

C++实现

#include <stack>
#include <iostream>
#include <stdlib.h>

using namespace std;



int main(int argc, char **argv)
{
    if (argc==1){
        cout<< "usage:./out <num...>" << endl;
        exit(1);   
    }
    stack<int> s;
    int index = 1;

    while (index < argc){
        int temp = atoi(argv[index]);       
        while ((s.size() > 0) && (s.top() < temp)){
            cout<< s.top() << "("<< index - 1 << ") ";
            s.pop();
        }
        s.push(temp);
        
        index++;
    }
    while (s.size() > 0){
        cout<< s.top() << "("<< -1 << ") ";
        s.pop();
    }
    cout << endl;
    return 0;
}

测试:

[[email protected] home]# ./a.out 2 8 3 4 0 5  2 4 6 3 8 10 3 4 3 29 4 6 4 2 74 3 2 5 3 21 62 29 0 2 43 4 5 
2(1) 3(3) 0(5) 4(5) 2(7) 4(8) 5(8) 3(10) 6(10) 8(11) 8(11) 3(13) 3(15) 4(15) 10(15) 4(17) 2(20) 4(20) 6(20) 29(20) 2(23) 3(23) 3(25) 5(25) 21(26) 0(29) 2(30) 29(30) 4(32) 5(-1) 43(-1) 62(-1) 74(-1) 
[[email protected] home]# ./a.out 5 9 3 0 4 5 6 9 
5(1) 0(4) 3(4) 4(5) 5(6) 6(7) 9(-1) 9(-1) 

点赞