出栈序列 洛谷1750

package pro.算法定向练习.数据结构;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Stack_1750 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()); // 数组的长度
        int c = Integer.parseInt(st.nextToken()); // 栈的长度
        int[] data = new int[n]; // 数组
        int[] stack = new int[c]; // 栈
        // idx 栈的索引, count 输出序列个数, 当前数组走到 pos数组的位置
        int idx = -1, count = 0, pos = 0;
        int[] ans = new int[n]; // 输出序列

        st = new StringTokenizer(br.readLine()); // 读数组

        for (int i = 0; i < n; i++) {
            data[i] = Integer.parseInt(st.nextToken());
        }

        while (count < n) {// 没有输出完
            if(idx < 0) { // 栈里面是空的情况
                int start = pos; // 从当前位置开始
                int end = pos + c > n ? n : pos + c; // 栈长度为结束位置
                for (int i = start; i < end; i++) {
                    if(data[i] < data[pos]) { // 寻找最小的数的索引 赋予给 pos
                        pos = i;
                    }
                }

                while (start <= pos) {// 从开始位置到最小的数逐步入栈
                    stack[++idx] = data[start++];
                }

                ans[count++] = stack[idx--]; // 出栈顶的数据
                pos++; // 当前元素已经出栈,下次开始的位置从pos+1开始
            } else { // 栈里面不为空的时候
                int top = stack[idx]; // 记录栈顶元素
                int start = pos; // 寻找最小数的开始位置
                // 寻找最小数的结束位置,因为栈元素索引是0开始 所以多减1
                int end = pos + c - idx - 1 > n ? n : pos + c - idx - 1;
                // 寻找最小数是否比栈顶元素小
                boolean f = false;
                for (int i = start; i < end; i++) {
                    // 寻找最小数和栈顶进行比较
                    if(data[i] < top && !f) {
                        pos = i;
                        f = true;
                    }
                    // 寻找最小数和数据后面数据进行对比
                    else if(f == true && data[i] < data[pos]) {
                        pos = i;// 记录找到最小数据的pos位置
                    }
                }

                // 找到最小数的位置进行逐一入栈
                while (start <= pos && f) {
                    stack[++idx] = data[start++];
                }
                // 找到最小数的位置不是栈顶就需要将位置往后移一,下次需要从+1位置开始
                if(stack[idx] != top)pos++;
                // 出栈
                ans[count++] = stack[idx--];
            }
        }
        for (int i = 0; i < n; i++) {
            System.out.print(ans[i]);
            if(i!=n-1)System.out.print(" ");
        }
    }
}

  

posted @ 2020-12-03 17:01  姓蜀名黍  阅读(150)  评论(0)    收藏  举报