1. 程式人生 > 實用技巧 >02-線性結構4 Pop Sequence (25分)

02-線性結構4 Pop Sequence (25分)

02-線性結構4Pop Sequence(25分)

Given a stack which can keepMnumbers at most. PushNnumbers in the order of 1, 2, 3, ...,Nand pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, ifMis 5 andNis 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.

Input Specification:

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), andK(the number of pop sequences to be checked). ThenKlines follow, each contains a pop sequence ofNnumbers. All the numbers in a line are separated by a space.

Output Specification:

For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.

Sample Input:

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

Sample Output:

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; }