1. 程式人生 > >中綴轉字尾並計算(多位數)

中綴轉字尾並計算(多位數)

#中綴轉字尾並計算值

輸入一個包含+、-、*、和圓括號地正確表示式,輸出表達式、它的字尾表示式和計算後的值。 思路:將輸入的計算表示式存放在一個string中,在利用字串的功能將計算表示式中的數字和操作符分開存放在vector容器中,然後將中綴轉換成字尾,利用棧來計算表示式。

#include <stdio.h>
#include<stack>
#include<vector>
#include<sstream>
#include<string>
using namespace std;
vector<string> covertingInfixToRPN(vector<string>& exp) //中綴轉字尾
{
	vector<string> c;
	stack<string> op;
	string ch;
	for(int i=0;i<exp.size();i++)
	{
		if(exp[i] =="(")
			op.push(exp[i]);
		else if(exp[i] ==")") 
			while(1)
			{
				ch = op.top();
				op.pop();
				if(ch != "(")
					c.push_back(ch);
				else
					break;	
			}			
		else if(exp[i] =="+" || exp[i] =="-")
		{
			 while(op.size()>0 && op.top() != "(")
			{
				c.push_back(op.top());
				op.pop();
			}
			 op.push(exp[i]);		
		}
		else if(exp[i] =="*"|| exp[i] =="/")
		{
			while(op.size()>0&&(op.top() == "*"|| op.top() == "/" ))
			{
				c.push_back(op.top());
				op.pop();
			}
			 op.push(exp[i]);
		}
		else
			 c.push_back(exp[i]) ;
	}
	while(op.size()>0)
		{
			c.push_back(op.top());
			op.pop();
		}
	for(int j=0;j<c.size()-1;j++)
		cout << c[j] << " ";
	cout << c.back() << endl;
		
	return c;
}
int stringToInt(const string& it)//將字串轉換成數字 
{
	int ints;
	stringstream stream(it);
	stream >> ints;
	return ints;
}
int calculate(vector<string> c)//計算字尾表示式
{
	stack<int> res;
	int temp1,temp2,result;
	for(int i=0;i<c.size();i++)
	{
		if(c[i][0]<='9' && c[i][0]>='0')//判斷是否是純數字 
			res.push(stringToInt(c[i]));
		else
		{
			temp1 = res.top();
			res.pop();
			temp2 = res.top();
			res.pop();
			if(c[i] == "+")
		    	res.push(temp2+temp1);
			else if(c[i] == "-")
   				res.push(temp2-temp1);
			else if(c[i] == "*")
				res.push(temp2*temp1);
			else if(c[i] == "/")
				res.push(temp2/temp1);
		}
	}
	return res.top();
}
vector<string> process(const string& it)//將輸入的字串處理,將數字和字元分開 
{
	vector<string> temp;
	for(int i=0;i<it.length();i++)
	{
		if(it[i]<='9' && '0'<=it[i])
		{
			int j;
			for( j=i+1;j<it.length();j++)
			{
				if(it[j]<'0' || it[j]>'9')
					break;
			}
			temp.push_back(it.substr(i,j-i));
			i=j-1;
		}
		else
			  temp.push_back(it.substr(i,1));
	}
	return temp;
		
}
int main() {
		string s;
		vector<string> formula;
		int result,number;
		cin >> s;
		formula = process(s);
		cout << s << endl;
		vector<string> rpn;
		rpn = covertingInfixToRPN(formula);
		result = calculate(rpn);
		cout << result;
	return 0;
}