C++ 栈的应用简单中缀表达式求解
直接使用中缀表达式求解的简单代码,使用到了自带的栈的库函数,直接利用中缀表达式求解的过程是这样:首先要将中缀表达式中的操作符和操作数分开,、创建了两个栈来分别存储操作数和操作符,其次扫描表达式,遇到数字则入操作数栈(这里我写的是只有一位的数字,如果多位则要加入其余判断条件获取完整的数字再填入),遇到操作符,做优先级的判断,如果优先级高于操作符栈顶元素,则入栈,反之,则取出两个操作数计算后,压入操作数栈,再次比较。
基本思想如上所述,这里代码注释尽量详细了,如有bug欢迎友好斧正。
#include<iostream>
#include<stack>
#include<string.h>
using namespace std;
char fix[50];
int judge_level(char s)
{
switch(s)
{
case '+':
return 1;
break;
case '-':
return 1;
break;
case '*':
return 2;
break;
case '/':
return 2;
break;
case '(':
return 0;
break;
case ')':
return -1;
break;
}
}
int tmp_caculate(char s,int a,int b)
{
switch(s)
{
case '+':
return a+b;
break;
case '-':
return a-b;
break;
case '*':
return a*b;
break;
case '/':
return a/b;
break;
}
}
int caculate()
{
stack <int> num;
stack <char> op;
for(int i = 0;i<strlen(fix);i++)
{
if(isdigit(fix[i]))
{
num.push(fix[i]-48);
}
else
{
int tmp = judge_level(fix[i]);
if(op.empty()==true)
{
op.push(fix[i]);
}
else
{
int top_t = judge_level(op.top());
if(tmp==0)
{
op.push(fix[i]);
}
else if(tmp>top_t)
{
op.push(fix[i]);
}
else if(tmp<top_t|tmp==top_t)
{
char s_op = op.top();
op.pop();
int num_b = num.top();
num.pop();
int num_a = num.top();
num.pop();
int res = tmp_caculate(s_op,num_a,num_b);
num.push(res);
if(tmp==-1)
{
op.pop();
}
else
{
i--;
}
}
}
}
}
while(op.empty()==false)
{
char s_op = op.top();
op.pop();
int num_b = num.top();
num.pop();
int num_a = num.top();
num.pop();
int res = tmp_caculate(s_op,num_a,num_b);
num.push(res);
}
return num.top();
}
int main()
{
cout<<"输入中缀表达式:";
cin>>fix;
int res = caculate();
cout<<"结果为:"<<res;
}