栈的应用之二 —— 表达式的计算 (简单计算器的实现)

表达式有三种表示形式:前缀、中缀以及后缀。
我们平时使用的就是中缀表达式,如 A*B/C (运算符在运算数之间)
而编译器则是采用后缀表达式,如 AB*C/,AB+等
因此,用程序解决表达式,我们需输入后缀表达式

后缀表达式的运算过程: 从左到右依次遍历表达式中的每一项,如果遇到的是操作数,进栈;如果该项是运算符
<s>,则从栈顶处取两个元素B和A,计算A<s>B,并将结果压入栈中,继续扫描。等表达式遍历一遍后,栈中剩雨
元素即为表达式的值。
代码如下:
#include<iostream>
#include<cmath>
#include<stack>
using namespace std;
struct Calculator
{
	void Run()//执行表达式计算 
	stack <double> s;
	void AddOperand(double value);//操作数进栈 
	bool Get2Operands(double left,double right);//取值 
	void Operator(char op);//计算  
	void Clear()//清栈 
}; 
void Calculator::Operator(char op)
{
	double left,right,value;//左值,右值以及结果 
	bool judge;//用来标记判断是否取值成功 
	judge=Get2Operands(left,right);
	if(judge==true)//取数成功 
	{
		switch(op)
		{
			case '+':value=right+left;s.push(value);break;//加
			case '-':value=right-left;s.push(value);break;//减 
			case '*':value=right*left;s.push(value);break;//乘 
			case '/':if(right==0.0)
			{
				cerr<<"Divide by 0"<<endl;
				Clear(); 
			 } 
			 else{
			 	value=left/right;s.push(value);break;
			 }
		}
		else Clear();
	}
 } 
 bool Calculator::Get2Operands(double &left,double &right)
 {
 	if(s.empty()==true)
 	{
 		cerr<<"栈空,缺右操作数"<<endl;
 		return false;
	 }
	 right=s.top();
	 s.pop();
	 if(s.empty()==true)
	 {
	 	cerr<<"栈空,缺左操作数"<<endl;
	 	return false;
	 }
	 left=s.top();
	 s.pop();
	 return true;
 }
 void Calculator::AddOperand(double value)
 {
 	s.push(value);
 }
 void Calculator::Clear()
 {
 	while(s.empty()==false)
 	{
 		s.pop();
	 }
 }
 void Calculator::Run()//读字符串,并求后缀表达式的值,以'#'结束 
 {
 	char ch;
 	double newwoperand;
 	while(cin>>ch&&ch!='#')
 	{
 		switch(ch)
 		{
 			case'+':case'-':case'*':case'/'://运算 
 				Operator(ch);break;
 				default:cin.putback(ch);break;//将字符放回输入流
				 cin>>newoperand;//重新读取操作数
				 AddOperand(newoperand);//操作数入栈 
		 }
	 }
 }
如何将中缀表达式改为后缀,请看下一节
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值