基于栈的可操作判断
描述
假设I和O分别代表入栈和出栈操作。栈的始态和终态均为空。入栈和出栈的操作序列可以表示为仅由I和O组成的序列,称可操作的序列为合法序列,否则称为非法序列。请设计一个算法,判断所给的操作序列是否合法。若合法输出“true”,反之输出“false”。
输入
多组数据,每组数据为一行长度不定的操作序列A。当A为“0”时,输入结束。
输出
对应每组数据输出一行。若序列A为合法序列输出“TRUE”,反之输出“FALSE”。
样例输入1
IOIOIO IIOOOO 0
样例输出1
TRUE FALSE
解答:建立链式栈。判断出栈时,以及操作完成后栈是否为空。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
char data;
struct node *next;
} Node,*StackList;
int main()
{
char s[100];
StackList st;
Node *p,*q;
while(1)
{
scanf("%s",s);
if(s[0]=='0')
break;
st=NULL;
int flag=1;
for(int i=0; ; i++)
{
if(s[i]=='\0')
break;
if(s[i]=='I')
{
p=(Node *)malloc(sizeof(Node));
p->next=st;
st=p;
}
else
{
if(st==NULL)
{
printf("FALSE\n");
flag=0;
break;
}
else
{
q=st;
st=st->next;
free(q);
}
}
}
if(flag)
{
if(st==NULL)
printf("TRUE\n");
else
printf("FALSE\n");
}
}
return 0;
}