逆波兰表达式C++实现

原创 2018年04月16日 13:59:16
/*
This programe was designed to calculate a fomulation;
Editor:Xiangyu LV
Edit Time:2018年3月13日05:11:44
E-mail::lvxiangyu11@gamail.com
ALL RIGHT RESERVED
*/
#define text

#include<iostream>
#include<string>
#include<vector>
#include<stack>


using namespace std;

stack<char> CharStory;//标识符暂存栈
stack<long> CalculateStory;//标识符弹栈暂存栈
vector<string> PostFix;//存储后缀表达式;

void init()
{
	char tempc = cin.peek();
	bool IsNumCarry = false;//判断整数是否录入完
	while (cin.peek() != '\n')//如果没有读完
	{
		cin.get(tempc);
		switch (tempc)
		{
		case '+':case  '-'://以上字符读入时立即入栈
		{
					 if (CharStory.size() > 0&&CharStory.top()!='('){
						 PostFix.push_back("");
						 PostFix[PostFix.size() - 1] +=CharStory.top();
						 CharStory.pop();
					 }
					 IsNumCarry = false;
					 CharStory.push(tempc);
		}
			break;
		case '*':case  '/'://以上字符读入时入栈
		{
					 if (CharStory.size()<1 || CharStory.top() == '+' || CharStory.top() == '-'&&CharStory.top() != '(')//如果当前优先级大于前一个优先级入栈
					 {
						 IsNumCarry = false;
						 CharStory.push(tempc);
					 }
					 else{
						 if (CharStory.size() > 0){
							 PostFix.push_back("");
							 PostFix[PostFix.size() - 1] += CharStory.top();
							 CharStory.pop();
							 IsNumCarry = false;
							 CharStory.push(tempc);
						 }
					 }
		}
			break;
		case '^'://以上字符读入时入栈
		{
					 if (CharStory.size()<1 || CharStory.top() == '+' || CharStory.top() == '-'&&CharStory.top() != '(' || CharStory.top() == '*' || CharStory.top() == '/')//如果当前优先级大于前一个优先级入栈
					 {
						 IsNumCarry = false;
						 CharStory.push(tempc);
					 }
					 else{
						 if (CharStory.size() > 0){
							 PostFix.push_back("");
							 PostFix[PostFix.size() - 1] += CharStory.top();
							 CharStory.pop();
							 IsNumCarry = false;
							 CharStory.push(tempc);
						 }
					 }
		}
			break;


		case '1':case '2':case '3':case'4':case '5':case '6':case'7':case'8':case'9':case'0'://读入数字立即写出
		{

					 if (IsNumCarry)
						 PostFix[PostFix.size() - 1] += tempc;
					 else
					 {
						 PostFix.push_back("");
						 PostFix[PostFix.size() - 1] += tempc;
					 }
					 IsNumCarry = true;
		}
			break;
		case '('://(直接压栈
		{
					 IsNumCarry = false;
			CharStory.push(tempc);
		}break;

		case ')':{//读入)全部输出直到(
					 { IsNumCarry = false;
						 while (CharStory.size()>0&&CharStory.top() != '(')
						 {
							 PostFix.push_back("");
							 PostFix[PostFix.size() - 1] += CharStory.top();
							 CharStory.pop();
						 }
						 CharStory.pop();//弹出(
					 }
		}
			break;
		default:
			break;
		}
	}
	while (CharStory.size() > 0)
	{
		PostFix.push_back("");
		PostFix[PostFix.size() - 1] += CharStory.top();
		CharStory.pop();
	}
#ifdef text
	for (int i = 0; i < PostFix.size(); i++)
	{
		cout << PostFix[i];
	}
#endif

}

long ChangToLongInt(string temp)
{
	long back=0;
	for (int i = 0; i < temp.size(); i++)
	{
		back << 1;
		back += temp[i] - '0';
	}
	return back;
}
void count()
{
	long temp;
	for (auto i:PostFix)
	{
		if (i != "+" &&i != "-" &&i != "*" &&i != "/" &&i != "^")
		{
			CalculateStory.push(ChangToLongInt(i));
		}
		else
		{
			if (i == "*")
			{
				temp = CalculateStory.top();
				CalculateStory.pop();
				temp *= CalculateStory.top();
				CalculateStory.pop();
			}
			if (i == "/")
			{
				temp = CalculateStory.top();
				CalculateStory.pop();
				temp /= CalculateStory.top();
				CalculateStory.pop();
			}
			if (i == "+")
			{
				temp = CalculateStory.top();
				CalculateStory.pop();
				temp += CalculateStory.top();
				CalculateStory.pop();
			}
			if (i == "-")
			{
				temp = CalculateStory.top();
				CalculateStory.pop();
				temp -= CalculateStory.top();
				CalculateStory.pop();
			}
			if (i == "^")
			{
				temp = CalculateStory.top();
				CalculateStory.pop();
				temp = pow(temp,CalculateStory.top());
				CalculateStory.pop();
			}
			CalculateStory.push(temp);
		}
	}
	cout << temp;

}

int main()
{
	cout << "Plase enter the fomulation:" << endl;
	init();
	cout << "=";
	count();
#ifdef text
	system("pause");
#endif
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvxiangyu11/article/details/79959731

逆波兰表达式C++代码实现

当我们输入一个数学表达式,是中缀表达式,我们首先转换为后缀表达式(逆波兰表达式),然后再进行求值。 在《大话数据结构》的104-100页有详细的介绍,下面是我理解之后的代码实现。 代码思路...
  • u010889616
  • u010889616
  • 2015年10月26日 18:34
  • 2679

逆波兰表达式实现计算器(附c++代码)

要实现一个简单的计算器,可以对+,-,*,/,(,)进行处理并返回正确的值,最先想到的就是逆波兰表达式实现之.首先,用到第一个栈把算式转化为逆波兰表达式存一个数组中,在使用另一个栈对这个数组进行,判断...
  • HLYHero
  • HLYHero
  • 2015年08月17日 23:04
  • 3812

计算表达式的值c++逆波兰式实现方法

#include//栈容器的头文件 #include #include //数学 头文件 次方函数 using namespace std; int Precedence(char op)//运算...
  • hishyboy
  • hishyboy
  • 2014年10月05日 22:10
  • 1635

栈的应用:逆波兰表达式

栈的应用:逆波兰表达式 输入:逆波兰表达式。 要求:1 .每个数字和符号之间用空格隔开。    2 .以#结尾,输出其结果。 输出:式子结果 代码如下(用的栈是刚刚自己写的哈,就在另外一篇博...
  • H992109898
  • H992109898
  • 2016年02月04日 20:02
  • 507

算术表达式的计算(基于逆波兰表达式)的c++实现

以字符串的形式输入一个算术表达式,如何对其进行识别并计算出结果呢?       如果按照普通的算术表达式计算,由于需要考虑到操作符和括号的优先级,实现起来十分麻烦。但是基于逆波兰表达式(也称后缀表达式...
  • llc3239
  • llc3239
  • 2015年09月26日 14:17
  • 988

递归求解逆波兰表达式

逆波兰表达式特征: 1.每个运算符两边是两个逆波兰表达式。 2.不用加括号就可以确定运算顺序 栗子:*/+12 36 + 1 3 - 15 8 设n()函数为求解逆波兰表达式的递归程序 1:n()*n...
  • ccc_zq
  • ccc_zq
  • 2016年03月27日 20:28
  • 891

逆波兰表达式递归

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此...
  • qq_32175379
  • qq_32175379
  • 2017年05月09日 16:59
  • 487

C++的逆波兰表达式的求解

逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此...
  • shiwazone
  • shiwazone
  • 2015年07月26日 14:45
  • 3505

【Algorithm】逆波兰表达式 Java实现

Java逆波兰表达式(后缀表达式)
  • huangpingcai
  • huangpingcai
  • 2017年06月29日 09:42
  • 1215

算法学习之递归--逆波兰表达式

递归的作用: 1) 替代多重循环 2) 解决本来就是用递归形式定义的问题 3) 将问题分解为规模更小的子问题进行求解 .... 这次我们用递归来解决递归形式的问题。 逆波兰表达...
  • qq_27474589
  • qq_27474589
  • 2017年08月22日 09:29
  • 301
收藏助手
不良信息举报
您举报文章:逆波兰表达式C++实现
举报原因:
原因补充:

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