后缀表达式实现六则运算

原创 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,在压入那个栈中。然后依次类推。

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

栈中缀表达式就是形如a(b-c)+d*这样我们平常写的式子,如果按平时逻辑上的处理顺序的话计算机比较难正确处理,因为运算符之间有优先级,括号的优先级比乘除高,乘除的优先级比加减高,这是小学的知识。 ...
  • dgeek
  • dgeek
  • 2017年03月19日 13:54
  • 2711

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

数据结构与算法分析——c语言描述 练习3.19 3.20 a b 答案 这道题以前发过文章。现在能支持幂^了。 栈的利用 挺重要的一个思想是 操作符 根据优先级分级 #include #inc...
  • qq789045
  • qq789045
  • 2016年03月28日 00:10
  • 636

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

使用栈来进行后缀表达式计算,流程:从前向后读取后缀表达式的项目,遇到数值压入栈中,遇到运算符pop出栈顶的两项做运算,运算结果再放入栈中直到= 例子:求后缀表达式4x*2x*a-c*+=? ...
  • iOSTerry
  • iOSTerry
  • 2016年06月16日 23:10
  • 1976

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

后缀表达式相对于中缀表达式的优点: 1:不考虑运算优先级和括号。 2:从左到右单次扫描即可,时间复杂度O(1)。 注意: 堆栈是一种计算后缀表达式的理想数据结构,本例中笔者使用了java.ut...
  • u014088119
  • u014088119
  • 2014年04月02日 14:30
  • 1330

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

首先提一句,我所用的IDE是VS2013。编译器不同,所支持的特性也就不同; 现在的C++已经发展到C++11版本,因此VS2008基本就不支持C++11新的特性; 我们用后缀表达式,利用数据...
  • qq_31828515
  • qq_31828515
  • 2016年11月27日 17:12
  • 1064

C++用后缀表达式(逆波兰)求四则表达式值,采用STL中的stack

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

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

一、问题概述: 人们经常书写的数学表达式属于中缀表达式,今天要解决的是,后缀表达式的求解问题。 如下图分别为举例的中缀表达式和后缀表达式: 二、解决思路 我们用栈存储后缀表达式...
  • xxpresent
  • xxpresent
  • 2016年11月29日 14:55
  • 1296

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

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

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

本来大一的时候在ACM的时候学数据结构的时候学过多项式计算  那个时候用的C语言  ,当时觉得好复杂,,大概徘徊过将近一周 都没有啃下来,后来也就放弃了,,现在学习C#的win form 想写过计算器...
  • qq_25235869
  • 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
  • chenkeng2009081030
  • 2014年02月23日 20:01
  • 555
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:后缀表达式实现六则运算
举报原因:
原因补充:

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