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

#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;
}

• 本文已收录于以下专栏：

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

• dgeek
• 2017年03月19日 13:54
• 2711

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

• qq789045
• 2016年03月28日 00:10
• 636

## 使用c语言实现后缀表达式计算器

• iOSTerry
• 2016年06月16日 23:10
• 1976

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

• u014088119
• 2014年04月02日 14:30
• 1330

## 【数据结构】用栈实现对后缀表达式的计算

• qq_31828515
• 2016年11月27日 17:12
• 1064

## C++用后缀表达式（逆波兰）求四则表达式值，采用STL中的stack

C/C++计算四则运算表达式的值
• guo8113
• 2014年09月10日 10:17
• 2584

## 用栈实现后缀表达式求解问题

• xxpresent
• 2016年11月29日 14:55
• 1296

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

1*2+3*4, 这个对应的中缀表达式就是[1,*,2,+,3,*,4], 需要转换成后缀表达式[1,2,*,3,4,*,+], 才能进一步计算得到结果.1.得到后缀表达式需要准备两个容器, 符号栈 ...
• chuchus
• 2017年04月24日 11:15
• 639

## c# 利用后缀表达式 计算多项式

• qq_25235869
• 2015年12月14日 12:34
• 1361

## 【数据结构】中缀表达式|后缀表达式|前缀表达式

1、把下列的后缀和前缀表达式转换为相应的中缀表达式 AB*C-D+ ABC+*D- +-*ABCD 2、利用栈把下列中缀表达式转换为后缀表达式和前缀表达式 D-B+C A*B+C*D (A+B)*C-...
• chenkeng2009081030
• 2014年02月23日 20:01
• 555

举报原因： 您举报文章：后缀表达式实现六则运算 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)