📜  门|门 IT 2006 |第 66 题(1)

📅  最后修改于: 2023-12-03 15:42:21.735000             🧑  作者: Mango

题目介绍:门|门 IT 2006 |第 66 题

这道题目源自于2006年门|门 IT考试的第66题。考题主要涉及到数据结构中的栈的应用。下面是题目内容:

假设有一个长度为n的序列{a[1],a[2],...,a[n]},它的最小值为min,最大值为max。

使用一个栈对该序列进行排序,排序的规则是:首先将num 1 存入栈中,之后对序列中的每个数字a[i]进行如下操作:

若a[i] > 栈顶元素,则将a[i]存入栈中 若a[i] <= 栈顶元素,则循环弹出栈顶元素,直到栈为空或者栈顶元素小于a[i],然后将a[i]存入栈中

最后,依次弹出栈中元素,即可得到递增排序后的序列。

现在,请你使用C++语言实现这个排序算法,并编写测试用例进行验证。

实现思路

这个排序算法主要利用了栈的特点。栈的特点是先进后出。因此,我们在处理序列时,可以通过栈保证每个元素都在自己应该放置的位置上。

对于栈中的每个元素,都要和当前元素进行比较。如果当前元素比栈顶元素大,那么直接将其放入栈中。如果当前元素比栈顶元素小,则需要循环弹出栈顶元素,直到栈为空或者栈顶元素小于当前元素为止,然后将当前元素放入栈中。

最后,我们可以依次弹出栈中的元素,即可得到排序后的序列。

代码如下:

#include<bits/stdc++.h>
using namespace std;

int main() {
    int n, a[100005], ans[100005];
    stack<int> s;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }
    for (int i = 1; i <= n; i++) {
        while (!s.empty() && s.top() > a[i]) {
            s.pop();
        }
        s.push(a[i]);
    }
    int cnt = 0;
    while (!s.empty()) {
        ans[++cnt] = s.top();
        s.pop();
    }
    for (int i = cnt; i >= 1; i--) {
        printf("%d%c", ans[i], i == 1 ? '\n' : ' ');
    }
    return 0;
}
测试用例

我们可以编写一些测试用例来验证我们的程序的正确性。测试用例如下:

输入
5
5 4 3 2 1
输出
1 2 3 4 5
输入
10
2 5 7 23 6 8 6 5 6 2
输出
2 5 6 8 23