# 后缀表达式实现六则运算

#include<iostream>
#include<stack>
#include<string>
using namespace std;
void StringDevide(string str,int &num,string st1[])
{
for(int i=0;i<100;i++)
st1[i][0]='\0';
int n=str.size();
int j=0,count=0;
for(int i=0;i<n;i++)
{
if(str[i]!=' ')
{
st1[count].push_back(str[i]);
}
else
{
count++;
}
}
num=count+1;
}
void StringToNum(string str,int &num)
{
num=0;
int n=str.size();
for(int i=0;i<n;i++)
{
num=num*10;
num+=str[i]-'0';
}
}
class InterTreeComputer
{
private:
//要计算的表达式
string m_expresion;
//将数字存储到栈中
stack<int> m_num;

public:
InterTreeComputer(string expression):m_expresion(expression)
{}
//判定某一操作符是否是运算符
bool IsOperator(char ch)const;
//获取要计算的两个运算数
void GetOperands(int &left,int &right);
//对获取的两个数按照符号ch进行计算
int computer(int left,int right,char ch)const;
//获取表达式
string GetPostoperation()const;
void SetPostoperator();
//计算表达式并返回结果
int Evaluate();
};
bool InterTreeComputer::IsOperator(char ch)const
{
switch(ch)
{
case '+':
case '-':
case '*':
case '/':
case '%':
case '^':
return 1;
default:
return 0;
}
}
void InterTreeComputer::GetOperands(int &left,int &right)
{
if(m_num.empty())
{
cout<<"num stack is empty!";
return ;
}
right=m_num.top();
m_num.pop();
if(m_num.empty())
{
cout<<"the expression is wrong!"<<endl;
return ;
}
left=m_num.top();
m_num.pop();
}
int InterTreeComputer::computer(int left,int right,char ch)const
{
switch(ch)
{
case '+':
return left+right;
break;
case '-':
return left-right;
break;
case '*':
return left*right;
break;
case '/':
if(right==0)
{
cout<<"the expression is wrong"<<endl;
return -1;
}
return left/right;
break;
case '%':
return left%right;
break;
case '^':
if(left==0&&right==0)
{
cout<<"the expression is wrong"<<endl;
return -1;
}
int value=1;
while(right>0)
{
value*=left;
right--;
}
return value;
break;
}
}
string InterTreeComputer::GetPostoperation()const
{
return m_expresion;
}
void InterTreeComputer::SetPostoperator()
{}
int InterTreeComputer::Evaluate()
{
string *str=new string[100];
int num;
StringDevide(m_expresion,num,str);
for(int i=0;i<num;i++)
{
if(str[i][0]=='+'||str[i][0]=='-'||str[i][0]=='*'||str[i][0]=='/'
||str[i][0]=='%'||str[i][0]=='^')
{
char ch=str[i][0];
int left,right;
GetOperands(left,right);
int number=computer(left,right,ch);
m_num.push(number);
}
else
{
int numb=0;
StringToNum(str[i],numb);
m_num.push(numb);
}
}
return m_num.top();
}

#include<iostream>
using namespace std;
#include<string>
#include<stack>
#include"InterTreeComputer.h"
int main()
{
string str="2 5 + 3 * 8 3 / -";
string st1="2 3 ^ 1 +";
string st2="2 2 3 ^ ^ 4 /";
InterTreeComputer Comp(st2);
cout<<Comp.GetPostoperation()<<endl;
cout<<Comp.Evaluate()<<endl;
return 0;
}

#### 栈的应用-后缀表达式运算求值

2017-01-18 19:40:25

#### 后缀表达式计算器

2013年07月22日 376KB 下载

#### 用后缀表达式计算四则运算算法

2017-04-24 11:15:02

#### 关于用堆栈实现中后缀表达式计算的问题

2016-08-18 12:27:05

#### 使用堆栈计算后缀表达式--java实现

2014-04-02 14:30:17

#### 数据结构——后缀表达式计算【C语言实现】

2010年11月09日 4KB 下载

#### 实现逆波兰表达式（后缀表达式）的运算结果

2017-04-21 13:50:12

#### Java实现中缀表达式转后缀表达式并计算结果

2017-03-19 13:54:15

#### java将中缀表达式转为后缀表达式

2011-09-30 17:04:03

#### 中缀表达式转换成后缀表达式 计算后缀表达式的值 幂操作符添加到你的指令系统中去

2016-03-28 00:10:55