C++逻辑表达式运算逻辑表达式运算由大写英文字母和符号~、 *、+、()组成逻辑表达式,其中三个符号分别表示逻辑非、与、或运算,英文字母表示变量,变量有两种可能的取值,FALSE(0)或TRUE(1),、*、+、括号()可改变表达式的运算次序,且可以嵌套.编一个程序计算逻辑表达式的值.【输入格式】输入为若干行 第一行字符串s(1

问题描述:

C++逻辑表达式运算
逻辑表达式运算
由大写英文字母和符号~、 *、+、()组成逻辑表达式,其中三个符号分别表示逻辑非、与、或运算,英文字母表示变量,变量有两种可能的取值,FALSE(0)或TRUE(1),、*、+、括号()可改变表达式的运算次序,且可以嵌套.编一个程序计算逻辑表达式的值.
【输入格式】
输入为若干行
第一行字符串s(1

#include
using namespace std;
#define MAXSIZE 100
#define CHARNUM 26
//定义栈结构体
typedef struct _stack
{
char data[MAXSIZE];
int top;
} stack;
//将输入逻辑表达式字符串转换为逆波兰式的字符串
void translate(const char *p,char *pout)
{
stack op;
op.top=-1;
int i=0;
while (*p!='\0')
{
switch (*p)
{
case '(':
op.data[++op.top]=*p;
*p++;
break;
case ')':
while (op.data[op.top]!='(')
{
pout[i++]=op.data[op.top];
op.top--;
}
op.top--;
*p++;
break;
case ':
op.data[++op.top]=*p;
*p++;
break;
case '*':
case '+':
while ((op.top!=-1)&&(op.data[op.top]!='('))
{
pout[i++]=op.data[op.top];
op.top--;
}
op.data[++op.top]=*p;
*p++;
break;
case ' ':
break;
default:
pout[i++]=*p;
*p++;
}
}
while (op.top!=-1)
{
pout[i++]=op.data[op.top];
op.top--;
}
pout[i]='\0';
}
//逆波兰式的求解
bool calculator(const char* str)
{
stack st;
st.top=-1;
char ch0,ch1,c;
while (*str!='\0')
{
switch (*str)
{
case '0':
case '1':
st.data[++st.top]=*str;
break;
case ':
ch0=st.data[st.top--];
c=!(ch0-'0')+'0';
st.data[++st.top]=c;
break;
case '+':
ch0=st.data[st.top--];
ch1=st.data[st.top--];
c=((ch0-'0')||(ch1-'0'))+'0';
st.data[++st.top]=c;
break;
case '*':
ch0=st.data[st.top--];
ch1=st.data[st.top--];
c=((ch0-'0')&&(ch1-'1'))+'0';
st.data[++st.top]=c;
break;
default:
break;
}
*str++;
}
return st.data[st.top]-'0';
}
int main()
{
char str[MAXSIZE]={0};
int chartab[CHARNUM]={0};
fstream infile;
fstream outfile;
int sum;
//打开输入和输出文件
infile.open("stackc.in",fstream::in);
outfile.open("stackc.out",fstream::out);
//获取第一行字符串
infile.getline(str,MAXSIZE);
//获取第二行整数
sum=infile.get()-'0';
infile.get();
//得到各个变量的值
for (int i=0;i