题目描述:
假设以I和O分别表示入栈和出栈操作,栈的初试状态和终态都是空,出栈和入栈序列仅有I和O组成。
称可以操作的序列为合法序列,否则为非法序列。
写一个算法判断一个给定的序列是否合法。若合法返回True,否则返回false.
题目分析:
一个由出栈操作和入栈操作组成的序列,要是合法序列应该满足:
1.入栈的操作次数大于等于出栈操作的次数;
2.当遇到每个出栈操作时,判断入栈操作的次数是否大于等于出栈操作的次数。因为每个出栈操作的状态下,入栈操作的次数一定不小于出栈操作的次数。
int Judge(char str[]){
int i=0;
int countI;//入栈操作的次数
int countO;//出栈操作的次数
countI=countO=0;
while(str[i]!='\0'){
switch(str[i]){
case 'I':
countI++;
break;
case 'O'://当遇到出栈操作时,要判断这个状态下入栈的次数是否大于
//出栈的次数
countO++;
if(countO>countI){
printf("序列非法!\n");
return false;
}
}
i++;//无论出栈还是入栈,指针都要后移
if(countI>=countO){
printf("序列合法.\n");
return true;
}
}
}
int Judge2(char str[]){
int i=0;
int countI;
int countO;
int len;
len=strlen(str);
countI=countO=0;
for(i=0;i<len;){
if(str[i]=='I'){
countI++;
i++;//记得指针后移
}else{
if(str[i]=='O'){
countO++;
i++;//记得指针后移
if(countO>countI){
printf("操作序列非法..\n");
return false;
}
}
}
}
if(countI>=countO){
printf("操作序列合法!!!\n");
return true;
}
}