题目描述:
假设用I来表示入栈,O来表示出栈,栈的初态和终态都是空,用I和O的不同组合来代表不同的操作序列。请设计一个算法判断给出的操作序列是否合法,如果合法就返回true,否则返回false。
算法思想:
逐一扫描给出的入栈和出栈的序列,每扫描到任意个位置均需要检查出栈的次数(即‘O’的个数),判断是否小于等于入栈的次数(即‘I’的次数),若大于就是非法的序列,扫描结束之后,再判断入栈和出栈的次数是否相等,如果不相等,则说明错误,返回fasle。
代码如下:
int Judge(char A[]){
int i=j=k=0; //i为下标,j和k分别为字母I和O的个数
while(A[i]!='\0'){ //未到字符数组的最后
switch(A[i]){
case 'I':j++; break; //入栈次数增加一
case 'O':k++;
if(k>j) {
printf("序列非法!\n");
exit(0);
}
}
i++;
}
if(j!=k){
printf("序列非法!\n");
return false;
}
else{
printf("序列合法!\n");
return true;
}
}