7-3 Pop Sequence

7-3 Pop Sequence
https://pintia.cn/problem-sets/16/problems/665

第一遍做时,为了比较严谨好看,把栈做成了内存动态分配+结构体的形式,类似的还有一个pop序列和对应指针等变量,结果把我给搞晕了,中间有个样例会溢出导致异常,头昏脑胀半天没找出bug。
后来直接重构了代码,栈和pop序列都用了简单的int数组,并且第二遍做的时候思路也更清晰了一点,比较快做完了。

思路比较简单:按照1,2,3,……,n的顺序不断push进栈中,每次push完检测栈顶元素是否和当前pop序列中元素相等(相等就说明该序列是可行的),如果是,就不断pop弹出,然后继续push进栈。这个过程中如果栈满了,那么直接跳出循环。
循环结束后,检测栈和pop序列是否为空,如果是,说明这个序列是一个可能的栈弹出序列(”is a possible pop sequence of the stack.”),输出”YES”。反之如果还有元素,说明不能该序列是不可能的,输出”NO”。

出错点:

  1. 栈顶元素可能连续多个和pop序列中元素相等,因此应当用while循环检测是否相等(而不是if语句)。每次相等时,pop指针+1,栈指针-1。
  2. k个循环每个循环都是独立的、全新的,因此都要重新初始化pop序列和栈。

1
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
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <string.h>
#include<stdlib.h>

int stack[1003], stackNow = -1;

int size() {
return stackNow + 1;
}

int top() {
if (size() > 0) //如果不为空
{
return stack[stackNow];
}
else
return -1;
}

void pop() {
if (size() > 0)
--stackNow;
}

void push(int a) {
stack[++stackNow] = a;
}



int main()
{
int m, n, k;
int seq[1003], seqNow = 0; //存放序列
scanf("%d %d %d", &m, &n, &k);// 5 7 5

while (k--)
{
seqNow = 0; stackNow = -1;
for (int i = 0; i < n; i++)
scanf("%d", &seq[i]);


int num = 1;//将要放入的数字
while (num<(n + 1))
{
stack[++stackNow] = num++;

if (size() >m)
break;

while (size()>0 && seq[seqNow] == top())
{
seqNow++;
pop();
}

}
if (num== (n + 1) &&size()== 0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}