OceanSide On my own FEET
Fork me on GitHub

POJ 1363 Rails

poj 1363 Rails
一个序列s1进入一个栈,出来一个序列s2。判断s2是否可能是s1造成的


代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;

/**
 * poj 1363 Rails
 * 一个序列s1进入一个栈,出来一个序列s2。判断s2是否可能是s1造成的
 *
 * 思路:用一个队列q保存输出的序列,从1-N往栈中添加元素
 * 如果遇到队列q顶部元素 == 栈顶元素,那么对q做出队、对s
 * 做出栈操作。
 * 持续到N个元素都添加进栈后,如果栈不为空,说明按照队列q
 * 的序列出栈是不可行的;反之说明可行。
 *
 * 这里是利用队列的先进先出,而栈是先进后出的原则
 */

public class Rails {

    private Queue<Integer> q;
    private Stack<Integer> s;

    public Rails() {
        q = new ArrayDeque<>();
        s = new Stack<>();
    }

    /**
     * 从1-N次序进栈,根据队列q来出栈
     * @return
     */
    public boolean isStackCaused() {
        for (int i = 1; i <= q.size(); i++) {
            s.push(i);
            while (! s.isEmpty() && s.peek() == q.peek()) {
                s.pop();
                q.remove();
            }
        }
        return s.isEmpty();
    }

    // 将序列s2加入队列
    public void push(int x) {
        q.add(x);
    }

    /**
     * 一下为主函数,第一行是下面一块数据的长度
     * 第二行开始为待判断的出栈序列,一直到单一0时,该块数据结束,进入下一块
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line1 = br.readLine();
        String[] len = line1.trim().split(" ");
        while (Integer.parseInt(len[0]) != 0) {
            Rails r = new Rails();
            String line2 = br.readLine();
            String[] nums = line2.trim().split(" ");
            while (nums.length != 1 && Integer.parseInt(nums[0]) != 0) {
                for (int i = 0; i < nums.length; i++) {
                    r.push(Integer.parseInt(nums[i]));
                }
                if (r.isStackCaused()) {
                    System.out.println("Yes");
                }
                else {
                    System.out.println("No");
                }

                r = new Rails();
                line2 = br.readLine();
                nums = line2.trim().split(" ");
            }

            line1 = br.readLine();
            len = line1.trim().split(" ");
            System.out.println();
        }

    }

}


提交POJ,发现编译错误。本地IDEA是没有任何问题的,测试很多遍都可以。大概是POJ版本不一致吧

那就再来一个C++版本,保证思路正确


#include <stdio.h>
#include <stack>
#include <queue>
using namespace std;

bool isVaildOrder(queue<int> &order) {
	stack<int> S;		// 模拟栈
	int n = order.size();
	for (int i = 1; i <= n; i++) {
		S.push(i);
		// 如果栈和队列首部元素相等,就对二者进行pop操作,直到不相等 
		while (! S.empty() && S.top() == order.front()) {
			S.pop();
			order.pop();
		}
	} 
	// 如果最后栈为空,那么说明该序列合法,否则不合法 
	if (S.empty())
		return true;
	else 
		return false; 
}

int main() {
	int n, train;
	scanf("%d", &n);
	while (n) {
		scanf("%d", &train);
		while (train) {
			queue<int> order;
			// 因为train不是0,说明该行为一个序列,所以要将train加入队列 
			order.push(train);
			// 将序列剩余数字加入队列 
			for (int i = 1; i < n; i++) {
				int x;
				scanf("%d", &x);
				order.push(x);
			}
			// 判断序列是否合法
			if (isVaildOrder(order)) {
				printf("Yes\n");
			} 
			else {
				printf("No\n");
			}
			
			// 读取后面那行的数字
			scanf("%d", &train);
		}
		printf("\n");
		// 读取下一块的数字的长度
		scanf("%d", &n); 
	}
}

提交无误

posted @ 2021-03-29 17:22  EEthunder  阅读(180)  评论(0)    收藏  举报