题目的意思是给出一组数,问你是不是一组合法的出栈序列。
我有两个思路:
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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55
