单调栈

2018-07-24  本文已影响0人  Co_zy

单调栈

运行时限: 10000 ms 单次运行时限: 10000 ms 内存限制: 32 MB
总提交: 23次 通过: 5次

题目描述

单调栈是一个特殊的栈,它与普通的栈不同的地方在于:当准备把一个元素x从栈顶压栈的时候,如果目前栈顶元素y比x大,那么要将栈顶出栈;直至栈顶元素小于等于x或者栈为空,此时再将x入栈。(可以根据样例理解)

这样最后的栈自底到顶元素就是单调的,所以叫做单调栈。

程序输入说明

第一行一个整数n(n<=100000),表示待入栈的元素个数
第二行n个整数,表示一次入单调栈的元素
所有输入的元素是不超过10^9的正整数

程序输出说明

将最终状态的单调栈从底到顶按顺序输出

程序输入样例

可见格式 带空格和换行符的格式 带空格和换行符的格式说明

6
3 4 1 5 6 5

程序输出样例
Original Transformed 带空格和换行符的格式说明

1 5 5 
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    //int input;
    int stack[100000];
    int input[100000];
    int k;
    int top = -1;
    int i;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&input[i]);
    }
    for(i=0; i<n; i++)
    {
        if(top == -1)
            stack[++top] = input[i];
        else if(top!=-1 && stack[top] >input[i])
        {
//            do
//            {
//                top--;
//            }
//            while(stack[top] <= input[i] || top == -1);
//            stack[++top] = input[i];
            while(1)
            {
                top--;
                if(stack[top] <= input[i] || top == -1)
                {
                    stack[++top] = input[i];
                    break;
                }
            }
        }
        else
            stack[++top] = input[i];
    }
    //printf("top:%d\n",top);
    for(i=0; i<=top; i++)
        printf("%d ",stack[i]);
    //printf("%d %d %d",stack[0],stack[1],stack[2]);
    return 0;
}
//3 4 1 5 6 5

上一篇下一篇

猜你喜欢

热点阅读