輸出命題公式的真值表(字尾表示式)
阿新 • • 發佈:2018-12-21
1422.輸出命題公式的真值表
時限:1000ms 記憶體限制:10000K 總時限:3000ms
描述
先輸入一個正整數n(n小於等於10),表示共有n個命題變元,再輸入一個類似於逆波蘭表示式的字串表示一個命題公式,約定在該字串中用一位的十進位制數表示一個命題變元,用a、o、n、i、e分別表示且、或、非、蘊含、等值,用類似於逆波蘭表示式形式的字串表示的命題公式的真值表波蘭表示式(即二元運算,兩個運算元在前,運算子在後;一元運算,一個運算元在前,運算子在後)。
輸入
先輸入一個小於等於10的正整數n,再輸入一個字串。
輸出
輸出該字串表示的命題公式的真值表。
提示:
如果用P、Q、R分別表示這三個命題變元的話,
輸入資料01a2i表示的命題公式是:((P∧Q)→R)
輸入資料012ia表示的命題公式是:(P∧(Q→R))
輸入資料0n表示的命題公式是:┐P
輸入樣例
3
01a2i
輸出樣例
0 0 0 1
0 0 1 1
0 1 0 1
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 0
1 1 1 1
提示
來源
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <stack> using namespace std; stack <char> si; char str[100]; int b[100]; int n; void solve() { int i; int cnt=1; int ans; int len=strlen(str); for(i=0;i<len;i++) //字尾表示式是實時計算的。push的是數,符號不用push. { if(str[i]>='0'&&str[i]<='9') { si.push(b[cnt]); cnt++; } else if(str[i]=='a') { int x1=si.top(); si.pop(); int x2=si.top(); si.pop(); ans=x1&&x2; si.push(ans); } else if(str[i]=='o') { int x1=si.top(); si.pop(); int x2=si.top(); si.pop(); ans=x1||x2; si.push(ans); } else if(str[i]=='n') { int x1=si.top(); si.pop(); ans=!x1; si.push(ans); } else if(str[i]=='i') { int x1=si.top(); si.pop(); int x2=si.top(); si.pop(); if(x2==1&&x1==0) ans=0; else ans=1; si.push(ans); } else if(str[i]=='e') { int x1=si.top(); si.pop(); int x2=si.top(); si.pop(); ans=(x1==x2); si.push(ans); } } ans=si.top(); si.pop(); printf("%d\n",ans); } void dfs(int step) { int i; if(step==n+1) { for(i=1;i<=n;i++) printf("%d ",b[i]); solve(); return; } else { for(i=0;i<=1;i++) { b[step]=i; dfs(step+1); } } return; } int main() { scanf("%d",&n); scanf("%s",str); dfs(1); return 0; }