题目:I:入栈,O:出栈。写出一个算法,判定所给的操作序列是否合法。合法要求:栈的初态和终态均为空。若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)
关键字:判断入栈出栈操作序列是否合法
思路 :
入栈:无论多少次,只要内存足够,就可以进行
#限制:内存足够
出栈:必须保证栈非空才能进行出栈操作
#限制:栈非空,即每时每刻,出栈的总次数都应小于等于入栈的总次数
终态为空:入栈总次数=出栈总次数
1)依次逐一扫描入栈出栈序列(即由“I”和“O”),
每扫描至任一位置均需检查出栈次数(即“O”的个数)是否小于等于入栈次数(即“I”的个数)
若大于,则为非法序列。
需要变量:字符数组A[i],I的计数:j,O的计数:k
2)扫描结束后,再判断总的入栈次数和出栈次数是否相等
若不相等,则为非法序列。
需要变量:
int Judge(char A[]){//判断字符数组A中的输入输出序列是否是合法序列。如是,返回true,否则返回false
int i=0;
int j=k=0;
while(A[i]!='0'){
switch (A[i]){
case'I':j++;break;
case'O':k++;break;
if(k>j){
printf("序列非法\n");exit(0);}
}
i++;
}
if(j!=k){
printf("非法序列\n");
return false;
}
else{
printf("序列合法\n");
return true;
}
}