仅做个人笔记使用
题目:
给定一个最大容量为 M 的堆栈,将 N 个数字按 1, 2, 3, …, N 的顺序入栈,允许按任何顺序出栈,则哪些数字序列是不可能得到的?例如给定 M=5、N=7,则我们有可能得到{ 1, 2, 3, 4, 5, 6, 7 },但不可能得到{ 3, 2, 1, 7, 5, 6, 4 }。
输入格式:
输入第一行给出 3 个不超过 1000 的正整数:M(堆栈最大容量)、N(入栈元素个数)、K(待检查的出栈序列个数)。最后 K 行,每行给出 N 个数字的出栈序列。所有同行数字以空格间隔。
输出格式:
对每一行出栈序列,如果其的确是有可能得到的合法序列,就在一行中输出YES,否则输出NO。
输入样例:
5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2
输出样例:
YES
NO
NO
YES
NO
解析:
这道题题目挺简单,结果给我看了半天才理解题目的意思,本题的解法就是模拟入栈出栈的操作,假设输入的序列是合法的,将其与我们出栈时的元素一个个对比。就直接以判断5 6 7 4 3 2 1是否合法为例,模拟一下这个序列的合法性。
栈中元素 出栈序列
1 空
1 2 空
1 2 3 空
1 2 3 4 空
1 2 3 4 5 空
1 2 3 4 5
1 2 3 4 6 5
1 2 3 4 5 6
1 2 3 4 7 5 6
1 2 3 4 5 6 7
1 2 3 5 6 7 4
1 2 5 6 7 4 3
1 5 6 7 4 3 2
null 5 6 7 4 3 2 1
空
... ...
null 1 2 3 4 5 6 7
代码:
定义堆栈及声明函数
#include<stdio.h>
#include<stdlib.h>
#define MAXS 1001
#define MAXN 50
typedef enum { False, True }Bool;
typedef int ElementType;
//堆栈定义
typedef int Position;
typedef struct SNode* PtrToSNode;
struct SNode {
ElementType* Data;
Position Top;
int Maxsize;
};
typedef PtrToSNode Stack;
Stack CreateStack(int Maxsize);
bool IsEmpty(Stack S);
bool IsFull(Stack S);
bool Push(Stack S,ElementType X);
bool Pop(Stack S);
void Clear(Stack S);
主程序
int main() {
int N, M, K,i, j;
int Str[MAXS];
int num[MAXS];
Stack S;
scanf("%d %d %d\n", &M, &N, &K);
S = CreateStack(M);
for (i = 0; i < N; i++) {
num[i] = i + 1;
}
for (i = 0; i < K; i++) {
int y = 0;
while (1) {//输入一个数组序列,以判断出现回车为结束标志
scanf("%d", &Str[y++]);
if (getchar() == '\n') {
break;
}
}
Clear(S);
int cnt=0;
j = 0;
while(cnt<N)//一一比对str中的元素
{
if (S->Data[S->Top] == Str[cnt] ) {//如果栈顶元素和当前str的元素相等则弹出
Pop(S);
cnt++;
}
else {
if (j > N && !IsEmpty(S)) break;//判断出现num中的数字都已入栈,并且栈中还有剩余元素,就是不合法的情况
Push(S, num[j++]);
}
}
if (IsEmpty(S))printf("YES\n");
else printf("NO\n");
}
return 0;
}
相关函数:
Stack CreateStack(int Maxsize) {
Stack S = (Stack)malloc(sizeof(struct SNode));
S->Data = (ElementType*)malloc(Maxsize * sizeof(ElementType));
S->Top = -1;
S->Maxsize = Maxsize;
return S;
}
bool IsEmpty(Stack S) {
return (S->Top == -1);
}
bool IsFull(Stack S) {
return (S->Top == (S->Maxsize - 1));
}
bool Push(Stack S, ElementType X) {
if (IsFull(S)) return false;
else {
S->Data[++(S->Top)] = X;
return true;
}
}
bool Pop(Stack S) {
if (IsEmpty(S)) return false;
else {
(S->Top)--;
return true;
}
}
void Clear(Stack S) {
while(!IsEmpty(S))Pop(S);
}