方法一:
// exam1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;
int priority(char op)
{
switch(op)
{
case '(':
return 1;
case '+':
case '-':
return 2;
case '*':
case '/':
return 3;
case ')':
return 4;
case '#':
return 5;
}
}
bool cmp_lg(char op1,char op2)
{
int proi1=priority(op1);
int proi2=priority(op2);
if(proi1>=proi2)
{
return true;
}
else
{
return false;
}
}
int cal_func(char op,int num1,int num2)
{
switch(op)
{
case '+':
return num1+num2;
case '-':
return num1-num2;
case '*':
return num1*num2;
case '/':
return num1/num2;
default:
return num1+num2;
}
}
void cal(void)
{
cout<<"Please enter the formula whose end is '#'..."<<endl;
char ch;
stack<int> num;
stack<char> op;
while(1)
{
cin>>ch;
if(ch=='#')
{
break;
}
if(ch>='0' && ch<='9')
{
num.push(ch-'0');
}
else
{
if(op.empty())
{
op.push(ch);
}
else
{
char op1,op2;
op1=op.top();
op2=ch;
if(ch=='(')
{
op.push(ch);
}
else if(cmp_lg(op1,op2))
{
int result,num1,num2;
num1=num.top();
num.pop();
num2=num.top();
num.pop();
result=cal_func(op1,num1,num2);
num.push(result);
op.pop();
op.push(op2);
}
else
{
if(ch==')')
{
int result;
int num1,num2;
char op0;
num1=num.top();
num.pop();
num2=num.top();
num.pop();
op0=op.top();
op.pop();
op.pop();
result=cal_func(op0,num1,num2);
num.push(result);
}
else
{
op.push(ch);
}
}
}
}
}
while(!num.empty() && !op.empty())
{
int result;
int num1,num2;
char op0;
num1=num.top();
num.pop();
num2=num.top();
num.pop();
op0=op.top();
op.pop();
result=cal_func(op0,num1,num2);
num.push(result);
}
cout<<"The result is "<<num.top()<<"."<<endl;
}
int main(void)
{
cal();
system("pause");
return 0;
}
方法二:
将()内看成是一个数,使用递归算法进行解决
上代码
#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;
void calculate(stack<int> &num,stack<char> &op)
{
int b=num.top();
num.pop();
int a=num.top();
num.pop();
char sym=op.top();
op.pop();
switch (sym)
{
case '+':
num.push(a+b);
break;
case '-':
num.push(a-b);
break;
case '*':
num.push(a*b);
break;
case '/':
num.push(a/b);
break;
default:
;
}
}
int cal(char* s,int len)
{
char*p=s;
stack<int> num;
stack<char> op;
while(len!=0)
{
if(*p=='(')
{
int cnt=1;
char* cur=p+1;
while(cnt!=0)
{
if(*cur==')')
{
cnt--;
}
else if(*cur=='(')
{
cnt++;
}
else{}
cur++;
}
int tmp=cal(p+1,cur-p-2);
len=len-(cur-p-1);
num.push(tmp);
p=cur-1;
}
else if(*p<='9' && *p>='0')
{
num.push(*p-'0');
}
else if(op.empty())
{
op.push(*p);
}
else if(op.top()=='*' || op.top()=='/')
{
calculate(num,op);
op.push(*p);
}
else
{
if(*p=='*' || *p=='/')
{
op.push(*p);
}
else
{
calculate(num,op);
op.push(*p);
}
}
p++;
len--;
}
while(!op.empty())
{
calculate(num,op);
}
return num.top();
}
int main()
{
char* s="1+(4-3)*5/5-3+4";
int result=cal(s,strlen(s));
cout<<result<<endl;
system("pause");
return 0;
}