Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked).Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.
For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.
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
提交代码OC通过:
提交代码:
#include <stdio.h> #include <stdlib.h> #define ERROR -1 typedef int ElemType; typedef int Position; struct SNode { ElemType *Data; Position Top; int MaxSize; }; typedef struct SNode *Stack; Stack CreateStack(int MaxSize) { Stack S = (Stack)malloc(sizeof(struct SNode)); S->Data = (ElemType*)malloc(MaxSize * sizeof(ElemType)); S->Top = -1; S->MaxSize = MaxSize; return S; } void DestroyStack(Stack S) { if (S == NULL) { return; } if (S->Data) { free(S->Data); } free(S); } int IsFull(Stack S) { return (S->Top == S->MaxSize - 1); } int Push(Stack S, ElemType X) { if (IsFull(S)) { return 0; } else { S->Data[++(S->Top)] = X; return 1; } } int IsEmpty(Stack S) { return (S->Top == -1); } ElemType Pop(Stack S) { if (IsEmpty(S)) { return ERROR; } else { return (S->Data[(S->Top)--]); } } int main() { int maxStackSize, seqSize, stackNum; scanf("%d %d %d", &maxStackSize, &seqSize, &stackNum); int* outputFlag = (ElemType*)malloc(sizeof(ElemType) * stackNum); for (int i = 0; i < stackNum; ++i) { outputFlag[i] = 0; } ElemType* sequence = (ElemType*)malloc(sizeof(ElemType)*seqSize); Position pOrigin = 0; Position pSequence = 0; for (int i = 0; i < stackNum; ++i) {//对处理stackNum个Sequence的循环 for (int j = 0; j < seqSize; ++j) { scanf("%d", sequence + j); } pSequence = 0; Stack S = CreateStack(maxStackSize); ElemType count = 1; while (pSequence < seqSize) { if (S->Top == -1 || S->Data[S->Top] < sequence[pSequence]) { if (!Push(S, count++)) { break; } } else if (S->Data[S->Top] == sequence[pSequence]) { Pop(S); ++pSequence; } else { break; } } if (!IsEmpty(S) || pSequence != seqSize) { outputFlag[i] = 0; //printf("No\n"); } else { outputFlag[i] = 1; //printf("Yes\n"); } DestroyStack(S); } for (int i = 0; i < stackNum; ++i) { if (outputFlag[i] == 0) { printf("NO\n"); } else { printf("YES\n"); } } return 0; }
原文:https://www.cnblogs.com/2018shawn/p/13251903.html