POJ 1363 Rails 解题报告
POJ 1363 Rails 解题报告
题目的意思是给出一组数,问你是不是一组合法的出栈序列。
我有两个思路:
1、每个已出栈之后的数且小于此数的数都必须按降序排列。复杂度O(n^2)
2、另一个思路就是直接模拟入栈出栈过程。虽然模拟毫无技巧可言,但复杂度O(n),优于算法1。
题目的意思是给出一组数,问你是不是一组合法的出栈序列。
我有两个思路:
1、每个已出栈之后的数且小于此数的数都必须按降序排列。复杂度O(n^2)
2、另一个思路就是直接模拟入栈出栈过程。虽然模拟毫无技巧可言,但复杂度O(n),优于算法1。
1
2#include <cstdio>
3
4int stack[1005]; //栈
5int stack_len; //栈顶位置
6
7int main()
8{
9 int n;
10 while ( scanf( "%d", &n ), n != 0 )
11 {
12 int tmp;
13 int last;
14 while ( scanf( "%d", &tmp ) )
15 {
16 int max = 0;//初始化部分
17 int flag = 1;
18 stack_len = 0;
19 last = 1;
20
21 if ( tmp == 0 ) {putchar('\n'); flag = -1;break;}//如果是0结束此case
22 while ( last < tmp ) stack[stack_len++] = last++;//入栈
23 max = last;
24
25 for ( int i = 1; i < n; ++i )
26 {
27 scanf( "%d", &tmp );
28 if ( flag ) //前提是合理则判断,若已不合理只读如数据,不进行判断
29 {
30 if ( stack_len != 0 && stack[stack_len-1] == tmp ) //如果栈非空且下一个该出栈的数字与读入数字相同,则出栈
31 {
32 --stack_len;
33 last = tmp;
34 max>?=last;
35 }
36 else if ( tmp > last ) //如果读如的数字比已出栈的最大数字还大,则将读入数字之前的数字全部入栈,此数字作为出栈数字
37 {
38 for ( int i = max+1; i < tmp; ++i )
39 {
40 stack[stack_len++] = i;
41 }
42 max = last = tmp;
43 }
44 else //如果以上两个条件都不满足,则说明此数列不满足题意
45 {
46 flag = 0;
47 }
48 }
49 }
50 printf( "%s\n", (( flag == 1 )?"Yes":"No") );
51 }
52 }
53 return 0;
54}
55
2#include <cstdio>
3
4int stack[1005]; //栈
5int stack_len; //栈顶位置
6
7int main()
8{
9 int n;
10 while ( scanf( "%d", &n ), n != 0 )
11 {
12 int tmp;
13 int last;
14 while ( scanf( "%d", &tmp ) )
15 {
16 int max = 0;//初始化部分
17 int flag = 1;
18 stack_len = 0;
19 last = 1;
20
21 if ( tmp == 0 ) {putchar('\n'); flag = -1;break;}//如果是0结束此case
22 while ( last < tmp ) stack[stack_len++] = last++;//入栈
23 max = last;
24
25 for ( int i = 1; i < n; ++i )
26 {
27 scanf( "%d", &tmp );
28 if ( flag ) //前提是合理则判断,若已不合理只读如数据,不进行判断
29 {
30 if ( stack_len != 0 && stack[stack_len-1] == tmp ) //如果栈非空且下一个该出栈的数字与读入数字相同,则出栈
31 {
32 --stack_len;
33 last = tmp;
34 max>?=last;
35 }
36 else if ( tmp > last ) //如果读如的数字比已出栈的最大数字还大,则将读入数字之前的数字全部入栈,此数字作为出栈数字
37 {
38 for ( int i = max+1; i < tmp; ++i )
39 {
40 stack[stack_len++] = i;
41 }
42 max = last = tmp;
43 }
44 else //如果以上两个条件都不满足,则说明此数列不满足题意
45 {
46 flag = 0;
47 }
48 }
49 }
50 printf( "%s\n", (( flag == 1 )?"Yes":"No") );
51 }
52 }
53 return 0;
54}
55