您的位置:首页 > 其它

3.5判断出栈和入栈操作序列是否合法

2016-06-05 20:29 274 查看
题目描述:

假设以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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: