后缀表达式实现六则运算

原创 2012年03月23日 15:19:46

实现后缀表达式的类如下,该类计算的是已经处理好的后缀表达式。

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


测试的CPP文件如下:

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


什么是后缀表达式?
那就先说普通的算式 1+2*3-4 。这里,操作符+,-,*,/都是在表达是中间的情况叫做中缀表达式。中缀表达式,有一个特点就是有的时候,需要括号来表示优先级。
后缀表达式是计算机中常用的表达式,又叫逆波兰表达式(因为波兰表达式是前缀表达式,呵呵)。因为他并没有括号,所以计算表达更加简便。 例如 1+2*3-4 的后缀表达式就是 1 2 3 * + 4 - 。 他的本质是有一个栈,先压入三个数1 2 3 ,然后发现了下一个是*,就将栈的头两个拿出来做乘法,也就是2*3,结果得6,在压入那个栈中。然后依次类推。

用数组顺序栈实现表达式运算(后缀表达式)

//这个是用中缀转为后缀再进行运算,根据书上的改写,感觉书上写的有点麻烦...没办法,按照要求.还是硬生生的改写了函数,虽然有点不堪入目,但还好实现了带浮点,括号,负数的运算 #include #i...
  • piwwwiq
  • piwwwiq
  • 2012年10月20日 10:34
  • 704

实现逆波兰表达式(后缀表达式)的运算结果

在栈的应用中有一个最经典的例题,那就是逆波兰表达式的求值。 enum OPERATOR//定义一个枚举类型 { DATA,//数字 ADD,//下面为操作 SUB, MUL, DIV, }...

中缀表达式改后缀表达式运算

  • 2012年10月09日 17:28
  • 14KB
  • 下载

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

后缀表达式是一种不需要括号的后缀表达法,也称为逆波兰 表示。 百度百科中的简介 :不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,...

C#使用栈实现中缀转后缀表达式

  • 2016年06月03日 09:40
  • 49KB
  • 下载

java使用后缀表达式实现计算器

  • 2017年11月12日 22:12
  • 23KB
  • 下载

数学运算后缀表达式转换成中缀表达式

#include #include #include #define MaxSize 32 typedef char Qelemtype; typedef struct { ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:后缀表达式实现六则运算
举报原因:
原因补充:

(最多只允许输入30个字)