上面说了中缀表达式转后缀表达式 ,下面我来实现一个电脑识别后缀表达式求解
#include"liststack.h"//引用已写好的栈文件
#include<string>
using namespace std;
typedef struct PERSON
{
Linknode node;
int index;
}Person;
//判断数字
int JudgeNum(char c)
{
return c >= '0' && c <= ' 9';
}
//判断左括号
int JudgeLeft(char c)
{
return c == '(';
}
//判断右括号
int JudgeRight(char c)
{
return c == ')';
}
//判断符号
int JudgeSymbol(char c)
{
return c == '+' || c == '-' || c == '*' || c == '/';
}
int swith(Person *&per, Person *&per1,char c)
{
int i;
switch (c)
{
case'+':i = per1->index + per->index; break;
case'-':i = per1->index - per->index; break;
case'*':i = per1->index * per->index; break;
case'/':i = per1->index / per->index; break;
default:
break;
}
return i;
}
Person* Myper(int i)
{
Person*per = (Person*)malloc(sizeof(Person));
per->index =i;
return per;
}
void main()
{
LinkStack* stack = Init_LinkStack();//初始化栈
char*str = "831-5*+"; //8 + (3 - 1) * 5 831-5*+
char*p = str;
while (*p != '\0')
{
if (JudgeNum(*p))
{
Push_LinkStack(stack, (Linknode*)Myper(*p-'0'));
}
if (JudgeSymbol(*p))
{
Person *per = (Person*)Top_LinkStack(stack);
Pop_LinkStackSe(stack);
Person *per1 = (Person*)Top_LinkStack(stack);
Pop_LinkStackSe(stack);
int i = swith(per,per1,*p);
Push_LinkStack(stack, (Linknode*)Myper(i));
}
p++;
}
Person *per = (Person*)Top_LinkStack(stack);
cout << per->index << endl;
Pop_LinkStackSe(stack);
FreeSplace_LinkStack(stack);
}
运行结果: