假设以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
#include "stdio.h"
#include "stdlib.h"
struct stack
{
char *base;
char *top;
int size;
};
int isempty(struct stack *s)
{
if(s->base==s->top)
{
return 1;
}
else
{
return 0;
}
}
int stacklegth(struct stack *s)
{
return (s->top-s->base);
}
int isfull(struct stack *s)
{
if(s->top-s->base>=s->size)
{
return 1;
}
else
{
return 0;
}
}
int push(struct stack *s,char e)
{
if(!isfull(s))
{
*(s->top)=e;
s->top++;
return 1;
}
else
{
return 0;
}
}
int pop(struct stack *s,char *e)
{
if(!isempty(s))
{
*e=*(s->top);
s->top--;
return 1;
}
else
{
return 0;
}
}
int init(struct stack *s,int n)
{
s->base=s->top=(char*)malloc(sizeof(struct stack)*10);
if(!s->base)
{
return 0;
}
s->size=n;
return 1;
}
int main()
{
int m,n,i;
scanf("%d %d",&m,&n);
getchar();
for(i=0;i<m;i++)
{
struct stack a;
init(&a,n);
char ch;
int t=0;
while((ch=getchar())!='\n')
{
if(ch=='S')
{
if(isfull(&a))
{
t++;
}
push(&a,'S');
}
else if(ch=='X')
{
if(isempty(&a))
{
t++;
}
char c;
pop(&a,&c);
}
}
if(t==0&&stacklegth(&a)==0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
颓废了很多天之后的第一篇博客。。是关于数据结构的题。
本文介绍了一种算法,用于判断由'S'(入栈)和'X'(出栈)构成的操作序列是否为合法的堆栈操作序列。合法序列需满足操作过程中不会出现栈溢出或下溢,并在最后保持栈为空的状态。通过使用结构体实现堆栈,包括初始化、判断满或空、压栈和弹栈等操作,最终实现了对输入序列的合法性检查。

1361

被折叠的 条评论
为什么被折叠?



