【正确答案】(1)A和D是合法序列,B和C是非法序列。
(2)设被判定的操作序列已存入一维数组A中。
int Judge(char A[ ]){
//判断字符数组A中的输入/输出序列是否是合法序列。如是,返回true,
//否则返回false
int i=0; //i为下标
int j=k=0; //j和k分别为I和字母O的个数
while(A[i] !='/0'){
switch(A[i]){
case'I': j++; break; //入栈次数增1
case'O'; k++; if(k>j){ printf("序列非法/n"); exit(0); }
}
i++; //不论A[i]是'I'或'O',指针i均后移}
if(j !=k){ printf("序列非法/n"); return(false); }
else{ printf("序列合法/n"); return(true); }
}
}
【答案解析】在入栈出栈序列(即由'I'和'O'组成的字符串)的任一位置,入栈次数('I'的个数)都必须大于等于出栈次数(即'O'的个数),否则视作非法序列,立即给出信息,退出算法。整个序列(即读到字符数组中字符串的结束标记'/0'),入栈次数必须等于出栈次数(题目中要求栈的初态和终态都为空),否则视为非法序列。