表达式计算(C++版)

//虽然遇到了很多困难,但还是坚持了下来,用到了STL中的栈。

#include 
#include 
#include 
using namespace std;


template 
void StackClear(stack &s)			//清空栈
{
	while(!s.empty())
		s.pop();
}


/*
判断读取到的字符是否是运算符
*/
int IsOperator(char c)
{
	switch(c)
	{
		case '+':
		case '-':
		case '*':
		case '/':
		case '(':
		case ')':
		case '=':
			return 1;
			break;
		default:
			return 0;
			break;
	}
}


/*
比较前后两个运算符的优先级
(为了判断方便,增设一个等号“=”作为表达式的定界符)
oper1>=oper2返回1
oper1 oper;
	stack data;	//运算符栈栈顶的运算符,操作数栈
	char tempNum[20];		//与多位数对应的字符数组
	int j=0;

	int i=0, flag=0;		//flag做标志,用来处理多位数

	oper.push('=');			//先将定界符(=)推入操作符栈

	c = express[i++];
	double num=0;

	while(c!='=' || x!='=')			//循环处理表达式中的每个字符
	{
		if(IsOperator(c))	//若是运算符
		{
			if(flag)		//将操作数入栈(因为读取到数字时,数字并没有及时进入数字栈)
			{
				tempNum[j]=0;					
				j=0;
				num = NumberSplicing(tempNum);	//遇到操作符时,将数值拼接的结果返回回来 
				//cout << "n----" << num << endl;
				data.push(num);			///
				num = 0; 				//入栈之后清空某一个操作数的暂存值
				flag = 0;				//且将标志置0,表示操作数已入栈
			}

			switch(Priority(x,c))
			{
				case -1:	//当前运算符c大于前一运算符x
					//cout << "o----" << c << endl;
					oper.push(c);		//当前运算符进栈/
					c=express[i++];		//取表达式下一字符
					break;

				case 0:					//括号(等号)配对
					oper.pop();			//运算符左半部分出栈(抛弃)
					c=express[i++];		//取表达式下一字符
					break;

				case 1:						//当前运算符c小于等于前一运算符x
					opera = oper.top();		//出栈之前取得栈顶元素
					oper.pop();				//运算符出栈

					b = data.top();
					data.pop();
					a = data.top();
					data.pop();				//两个操作数出栈
					double t = calculate(a,opera,b);	//计算结果
					data.push(t);		//将结算结果入栈
					break;
			}
		}

		else if(c>='0' && c<='9' || c=='.')	//若输入的是数字字符(不入栈,因为可能是多位数字)
		{
			tempNum[j++] = c;
			flag = 1; 				//设置操作数。表示操作数未入栈
			c=express[i++];
		}
		else
		{
			cout<<"输入有误\n";
			return 0;
		}

		x = oper.top();		//获取运算符栈顶的元素
		//cout<<"栈顶的操作符为:"<>express;
	cout << express << CalcExp(express);
	return 0;
}



你可能感兴趣的:(数据结构和算法基础,数据结构与算法)