7-2 堆栈操作合法性 (20分)
假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S和X序列,判断该序列是否合法。
输入格式:
输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S和X构成的序列。序列保证不为空,且长度不超过100。
输出格式:
对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。
输入样例:
4 10
SSSXXSXXSX
SSSXXSXXS
SSSSSSSSSSXSSXXXXXXXXXXX
SSSXXSXXX
输出样例:
YES
NO
NO
NO
作者
DS课程组
单位
浙江大学
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
Accepted Code
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Position;
typedef char ElementType;
struct SNode {
ElementType *Data; //存储元素的数组
Position Top; //栈顶指针
int MaxSize; //堆栈最大容量
};
typedef struct SNode *Stack;
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 IsFull( Stack S )
{
return (S->Top == S->MaxSize-1);
}
bool Push( Stack S, ElementType X )
{
if ( IsFull(S) ) {
//printf("堆栈满");
return false;
}
else {
S->Data[++(S->Top)] = X;
return true;
}
}
bool IsEmpty( Stack S )
{
return (S->Top == -1);
}
ElementType Pop( Stack S )
{
if ( IsEmpty(S) ) {
//printf("堆栈空");
return ERROR;
}
else
return ( S->Data[(S->Top)--] );
}
int main() {
int N = 0, M = 0;
scanf("%d%d", &N, &M);
for(int i = 0; i < N; i++) {
bool Flag = true; //判断是否是正确地栈
Stack s1;
s1 = CreateStack(M);
char str[105];
scanf("%s", str);
int len = strlen(str);
for (int j = 0; j < len; j++) {
if (str[j] == 'S') {
if (IsFull(s1)) {
Flag = false;
printf("NO\n");
break;
}
Push(s1, 'S');
} else {
if (IsEmpty(s1)) {
Flag = false;
printf("NO\n");
break;
}
Pop(s1);
}
}
if (Flag && IsEmpty(s1)) {
printf("YES\n");
}
if(Flag && !IsEmpty(s1)){
printf("NO\n");
}
}
}
仅供参考