每日一题Day39

基于栈的可操作判断

描述

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

猜你喜欢

转载自blog.csdn.net/ZLambert/article/details/81743475