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);
}
}