/* 求任意一个命题公式的真值表(B),并根据真值表求主范式(C)*/
// p、 q、 r、 () 、 &(∧)、 |(∨)、 > (->蕴含) 、 -(<->等价) ! (﹁否定)
//a &b | c > ( d ! e & f ) ! g
#include<stack>
#include <iostream>
#include<string>
#include<sstream>
using namespace std;
//int pri(char c)
//{
// if(c == '+' || c=='-')
// return 1;
// else if(c =='*' ||c=='/')
// return 2;
// else if(c=='(')
// return 0;
//}
string transform(char a[])
{
int i;
char c;
stack<char> st;//建立一个运算符堆栈
stringstream ss;//定义字符串流类
for(i=0;a[i];i++)
{
c=a[i];//为方便写
if(c == '&' || c=='|'||c =='>' ||c=='-'||c=='!')
{
// while(!st.empty() && pri(st.top()) >= pri(c)) //当算数优先级小于栈顶算算数符的t优先级
// {
// ss<< st.top()<< " ";//拼接c栈顶运算符
// st.pop();
// }
st.push(c);
}
else if(c =='(')
st.push(c);
else if(c == ')')
{
while(st.top() != '(')
{
ss<< " " << st.top();
st.pop();
}
st.pop();
}
else
ss<<c;
}
while(!st.empty())
{
ss << " "<< st.top();
st.pop();
}
return ss.str();
}
int main()
{
printf("程序功能: 求任意一个命题公式的真值表(B),并根据真值表求主范式(C)\n");
printf("命题公式由 p、 q、 r、 () 、 &(∧)、 |(∨)、 > (->蕴含) 、 -(<->等价) ! (﹁否定)构成\n");
while(~printf("请输入一个命题公式:"))
{
char s[100];
cin.getline(s,100);
string a=transform(s); //中缀转后缀
cout<<a<<endl;
}
return 0;
}
命题公式后缀转中缀
最新推荐文章于 2022-02-17 17:19:38 发布