问题描述
假设以S和X分别表示入栈和出栈操作。如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该序列是合法的堆栈操作序列。请编写程序,输入S和X序列,判断该序列是否合法。
输入
输入第一行给出两个正整数N和M,其中N是待测序列的个数,M(≤50)是堆栈的最大容量。随后N行,每行中给出一个仅由S和X构成的序列。序列保证不为空,且长度不超过100。
输出
对每个序列,在一行中输出YES如果该序列是合法的堆栈操作序列,或NO如果不是。
程序设计步骤
1.主函数
int main()
{
int N,M,i,j;
char Str[MAXS];
Stack S;
scanf("%d %d\n",&N,&M);
S=CreateStack(M);
for(i=0;i<n;i++)
{
scanf("%s",Str);//先循环输入字符,存在str
Clear(S);
for(j=0;Str[j]!='\0';j++)//判断字符是s还是x
{
if((Str[j]=='S')&&(!Push(S,1)))
break;
if((Str[j]=='X')&&(!Pop(S)))
break;
}
if((Str[j]=='\0')&&IsEmpty(S))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
2.需要的函数
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);//清栈
2.1
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;
}
2.2
bool IsEmpty(Stack S)
{
return (S->Top==-1);
}
bool IsFull(Stack S)
{
return (S->Top==(S->MaxSize-1));
}
2.3
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;
}
}
2.4
void Clear(Stack S)
{
while(!=IsEmpty(S))
Pop(S);
}
总代码
#include<stdio.h>
#include<stdlib.h>
#define MAXS 101
#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,i,j;
char Str[MAXS];
Stack S;
scanf("%d %d\n",&N,&M);
S=CreateStack(M);
for(i=0;i<n;i++)
{
scanf("%s",Str);//先循环输入字符,存在str
Clear(S);
for(j=0;Str[j]!='\0';j++)//判断字符是s还是x
{
if((Str[j]=='S')&&(!Push(S,1)))
break;
if((Str[j]=='X')&&(!Pop(S)))
break;
}
if((Str[j]=='\0')&&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));
}
2.3
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);
}