当前位置:编程学习 > C/C++ >>

poj3295

本题虽然简单,但是利用了编译原理里面的自顶向下方法来设计语法树,递归求解。

例如:对于逻辑表达式A&B|C,得到以下输出
 A B C    A&B|C
 0 0 0    0
 0 0 1    1
 0 1 0    0
 0 1 1    1
 1 0 0    0
 1 0 1    1
 1 1 0    1
 1 1 1    1

逻辑表达式支持:常量(只有0和1两种常量)、变量(用一个大写字母表示,因此最多26个变量)、“与”运算、“或”运算、“非”运算

用算符优先文法来做语法解析。优先级比较表如下:
  | & ! ( ) #
| > < < < > <
& > > < < > <
! > > > < > <
( < < < < = <
) > > > E > <
# > > > > > =

算符优先文法解析方式:
1、定义优先级比较表。除了真正需要使用的运算符。
2、使用了一个栈,只用于存放操作数(Operand)
3、若当前优先级小于栈顶优先级,则规约;若大于,则入栈。


则不难写出以下代码:

 

#include <iostream>   
#include <stack>   
#include <string>   
  
using namespace std;  
  
stack <int> stk;  
  
bool isvariable(char c, int pp, int qq, int rr, int ss, int tt)  
{  
    switch (c)  
    {  
    case 'p': stk.push(pp); return true;  
    case 'q': stk.push(qq); return true;  
    case 'r': stk.push(rr); return true;  
    case 's': stk.push(ss); return true;  
    case 't': stk.push(tt); return true;  
    }  
    return false;  
}  
  
void operand(char op)  
{  
    switch (op)  
    {  
    case 'K':  
        {  
            int x = stk.top();  
            stk.pop();  
            int y = stk.top();  
            stk.pop();  
            stk.push(x && y);  
            break;  
        }  
    case 'A':  
        {  
            int x = stk.top();  
            stk.pop();  
            int y = stk.top();  
            stk.pop();  
            stk.push(x || y);  
            break;  
        }  
    case 'C':  
        {  
            int x = stk.top();  
            stk.pop();  
            int y = stk.top();  
            stk.pop();  
            stk.push((!x) || y);  
            break;  
        }  
    case 'E':  
        {  
            int x = stk.top();  
            stk.pop();  
            int y = stk.top();  
            stk.pop();  
            stk.push(x == y);  
            break;  
        }  
    case 'N':  
        {  
            int x = stk.top();  
            stk.pop();  
            stk.push(!x);  
            break;  
        }  
    }  
    return;  
}  
  
int main()  
{  
    string s;  
    while (cin >> s && s != "0")  
    {  
        bool flag = true;  
        for (int pp = 0; pp <= 1; ++pp)  
        {  
            for (int qq = 0; qq <= 1; ++qq)  
            {  
                for (int rr = 0; rr <= 1; ++rr)  
                {  
                    for (int ss = 0; ss <= 1; ++ss)  
                    {  
                        for (int tt = 0; tt <= 1; ++tt)  
                        {  
                            for (int i = s.size() - 1; i >= 0; i--)  
                            {  
                                if (!isvariable(s[i], pp, qq, rr, ss, tt))  
                                    operand(s[i]);  
                            }  
                            int ans = stk.top();  
                            stk.pop();  
                            if (!ans)  
                            {  
                                flag = false;  
                                break;  
                            }  
                        }  
                        if (!flag)  
                            break;  
                    }  
                    if (!flag)  
                        break;  
                }  
                if (!flag)  
                    break;  
            }  
            if (!flag)  
                break;  
        }  
        if (flag)  
        {  
            cout << "tautology" << endl;  
        }  
        else cout << "not" << endl;  
          
        while (!stk.empty())  
        {  
            stk.pop();  
        }  
    }  
}  

#include <iostream>
#include <stack>
#include <string>

using namespace std;

stack <int> stk;

bool isvariable(char c, int pp, int qq, int rr, int ss, int tt)
{
	switch (c)
	{
	case 'p': stk.push(pp); return true;
	case 'q': stk.push(qq); return true;
	case 'r': stk.push(rr); return true;
	case 's': stk.push(ss); return true;
	case 't': stk.push(tt); return true;
	}
	return false;
}

void operand(char op)
{
	switch (op)
	{
	case 'K':
		{
			int x = stk.top();
			stk.pop();
			int y = stk.top();
			stk.pop();
			stk.push(x && y);
			break;
		}
	case 'A':
		{
			int x = stk.top();
			stk.pop();
			int y = stk.top();
			stk.pop();
			stk.push(x || y);
			break;
		}
	case 'C':
		{
			int x = stk.top();
			stk.pop();
			int y = stk.top();
			stk.pop();
			stk.push((!x) || y);
			break;
		}
	case 'E':
		{
			int x = stk.top();
			stk.pop();
			int y = stk.top();
			stk.pop();
			stk.push(x == y);
			break;
		}
	case 'N':
		{
			int x = stk.top();
			stk.pop();
			stk.push(!x);
			break;
		}
	}
	return;
}

int main()
{
	string s;
	while (cin >> s && s != "0")
	{
		bool flag = true;
		for (int pp = 0; pp <= 1; ++pp)
		{
			for (int qq = 0; qq <= 1; ++qq)
			{
				for (int rr = 0; rr <= 1; ++rr)
				{
					for (int ss = 0; ss <= 1; ++ss)
					{
						for (int tt = 0; tt <= 1; ++tt)
						{
							for (int i = s.size() - 1; i >= 0; i--)
							{
								if (!isvariable(s[i], pp, qq, rr, ss, tt))
									operand(s[i]);
							}
							int ans = stk.top();
							stk.pop();
							if (!ans)
							{
								flag = false;
								break;
							}
						}
						if (!flag)
							break;
					}
					if (!flag)
						break;
				}
				if (!flag)
					break;
			}
			if (!flag)
				break;
		}
		if (flag)
		{
			cout << "tautology" << endl;
		}
		else cout << "not" << endl;
		
		while (!stk.empty())
		{
			stk.pop();
		}
	}
}

 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,