前言(用前说明)
以下所有答案皆为作者本人所做,自认为写的是一坨,仅供参考,切勿抄袭(懂得都懂),也希望各位可以写下评论给出更好的解法,谢谢。
1
#include "allinclude.h"
Boolean isStatementFormula(pStatementFormula pFormula)
{ // Add your code here
StatementFormulaSymbles front,middle,next1;//前中后三个变量
int LeftNum=0,RightNum=0,pNum=0;
front=getCurrentSymbleType(pFormula);//获取句子的第一个符号
switch(front)//第一个字符的所有情况处理
{
case Exception:
case Conjunction:
case Disjunction:
case Implication:
case Equivalence:
case RightParenthesis:
return false;//当第一个字符为异常情况、合取号、析取号、蕴涵号、等价号、右括号时,返回错误,因为一个命题不可能以这些开头
case LeftParenthesis:
LeftNum++;//当第一个符号为左括号时,左数加1
break;
case EndOfFormula:
return true;//第一个字符为结束字符“#”,直接返回true
case PropositionalVariable://第一个字符为命题变元
pNum++;
}
//指示器指向下一个
nextPos(pFormula);
//接收下一个元素
middle=getCurrentSymbleType(pFormula);
switch(middle)//第二个字符的所有处理情况
{
case RightParenthesis:
return false;//第二个为右括号,什么情况下不为命题
case LeftParenthesis:
if(front==PropositionalVariable)
{
return false;//前面为命题变元
}
LeftNum++;//为左括号时,左数加1
break;
case PropositionalVariable:
if(front==PropositionalVariable)//第一个字符也为命题变元,第二个字符也是命题变元肯定不为命题
{
return false;
}
case Negation:
if(front==PropositionalVariable)//第一个字符也为命题变元,第二个字符也是命题变元肯定不为命题
{
return false;
}
}
while(next1!=EndOfFormula)//循环到下一个元素变量指向“#”字符时
{
nextPos(pFormula);//指示器指向下一个字符
next1=getCurrentSymbleType(pFormula);//下一个元素变量获取指示器所指元素
if(next1==LeftParenthesis)//下一个为左括号
{
LeftNum++;//左数加1
}
if(next1==RightParenthesis)//下一个为右括号
{
RightNum++;
}
if(front==Exception||middle==Exception||next1==Exception)//若其中有一个为异常字符,则返回false
{
return false;
}
if(middle==RightParenthesis)//中间为括号
{
if(next1==PropositionalVariable)//下一个为命题变元
{
return false;//错误,不是命题
}
if(next1==Negation)//下一个为否定号
{
return false;//错误,不是命题
}
}
if(middle==PropositionalVariable)//若q为命题变元
{
pNum++;
if(next1==PropositionalVariable||front==PropositionalVariable||next1==Negation||next1==LeftParenthesis)//前面和后面的不能为命题变元,后面也不可以是否定号
{
return false;
}
}
if(middle==Conjunction||middle == Disjunction||middle == Implication||middle==Equivalence)//若middle为联结词
{
if((front != PropositionalVariable && front != RightParenthesis)||(next1 !=PropositionalVariable && next1 != LeftParenthesis && next1 != Negation))//前后字符既不为命题变元,也不相应为右,左括号,并且后一个字符不为否定号,则为不合法的命题公式
{
return false;
}
if(next1 == Negation)//若nexts 为否定号
{
if(middle == PropositionalVariable||middle == RightParenthesis)//且currS 为命题变元或者右括号时
{
return false;
}
}
}
front=middle;//移位
middle=next1;
}
if(LeftNum!=RightNum||pNum==0)//右括号不等于左括号的数量
{
return false;
}
return true;
}
2
#include "allinclude.h"
Boolean my_Function(int leftNum,int rightNum,int pNum,StatementFormulaSymbles front,StatementFormulaSymbles middle,StatementFormulaSymbles next1,pStatementFormula pFormula)
{
nextPos(pFormula);//指示器指向下一个字符
next1=getCurrentSymbleType(pFormula);//下一个元素变量获取指示器所指元素
if(next1==LeftParenthesis)//下一个为左括号
{
leftNum++;//左数加1
}
if(next1==RightParenthesis)//下一个为右括号
{
rightNum++;
}
if(front==Exception||middle==Exception||next1==Exception)//若其中有一个为异常字符,则返回false
{
return false;
}
if(middle==RightParenthesis)//中间为括号
{
if(next1==PropositionalVariable)//下一个为命题变元
{
return false;//错误,不是命题
}
if(next1==Negation)//下一个为否定号
{
return false;//错误,不是命题
}
}
if(middle==PropositionalVariable)//若q为命题变元
{
pNum++;
if(next1==PropositionalVariable||front==PropositionalVariable||next1==Negation||next1==LeftParenthesis)//前面和后面的不能为命题变元,后面也不可以是否定号
{
return false;
}
}
if(middle==Conjunction||middle == Disjunction||middle == Implication||middle==Equivalence)//若middle为联结词
{
if((front != PropositionalVariable && front != RightParenthesis)||(next1 !=PropositionalVariable && next1 != LeftParenthesis && next1 != Negation))//前后字符既不为命题变元,也不相应为右,左括号,并且后一个字符不为否定号,则为不合法的命题公式
{
return false;
}
if(next1 == Negation)//若nexts 为否定号
{
if(middle == PropositionalVariable||middle == RightParenthesis)//且currS 为命题变元或者右括号时
{
return false;
}
}
}
front=middle;//移位
middle=next1;
if(next1!=EndOfFormula)//终止条件
{
return my_Function(leftNum,rightNum,pNum,front,middle,next1,pFormula);
}
if(leftNum!=rightNum||pNum==0)//左括号和右括号数不相等或命题变元个数为0
{
return false;
}
return true;
}
Boolean isStatementFormula(pStatementFormula pFormula)
{ // Add your code here
StatementFormulaSymbles front,middle,next1;
int leftNum=0,rightNum=0,pNum=0;
front =getCurrentSymbleType(pFormula);//获取第一个符号
switch(front)
{
case Exception:
case Conjunction:
case Disjunction:
case Implication:
case Equivalence:
case RightParenthesis://如果第一个元素为异常情况,合取号、析取号、蕴含号、等价号、右括号,则一定不为命题
return false;
case LeftParenthesis:
leftNum++;//第一个符号为左括号,则左括号数加1
break;
case EndOfFormula://第一个为结束字符为空命题
return true;
case PropositionalVariable://第一个字符为命题变元
pNum++;
}
nextPos(pFormula);//指示器指向第二个符号
middle=getCurrentSymbleType(pFormula);//中间字符读取出来
switch(middle)//第二个字符的所有处理情况
{
case RightParenthesis:
return false;//第二个为右括号,什么情况下不为命题
case LeftParenthesis:
if(front==PropositionalVariable)
{
return false;//前面为命题变元
}
leftNum++;//为左括号时,左数加1
break;
case PropositionalVariable:
if(front==PropositionalVariable)//第一个字符也为命题变元,第二个字符也是命题变元肯定不为命题
{
return false;
}
case Negation:
if(front==PropositionalVariable)//第一个字符也为命题变元,第二个字符也是命题变元肯定不为命题
{
return false;
}
}
return my_Function(leftNum,rightNum,pNum,front,middle,next1,pFormula);//递归函数开始
}