题目的意思是给出一组数,问你是不是一组合法的出栈序列。
我有两个思路:
1、每个已出栈之后的数且小于此数的数都必须按降序排列。复杂度O(n^2)
2、另一个思路就是直接模拟入栈出栈过程。虽然模拟毫无技巧可言,但复杂度O(n),优于算法1。
1
2
#include <cstdio>
3
4
int stack[1005]; //栈
5
int stack_len; //栈顶位置
6
7
int 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

4
int stack[1005]; //栈5
int stack_len; //栈顶位置6

7
int 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结束此case22
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


