C/C++带括号四则运算

(1).首先从string读入表达式,取出每一个字符后装入deque容器coll1中(源码在后面)

(2).从该容器取出每一个元素,利用栈将中缀表达式转换成后缀表达式(可参考:http://blog.csdn.net/anye3000/article/details/7939203),将后缀表达式装入容器coll3中。

(3).最后从coll3中取出元素逐一处理,既使用逆波兰式求值(如下图)。


///


///


C++源码

可编译并正常运行,此程序只支持一位数字运算,例如 3*(2+8)/5+6,有需要多位运算或者浮点型运算请自行修改,原理相同。

#include<stack>
#include<iostream>
#include<deque>
#include<string>
using namespace std;

//判断是否为括号
bool isPra(char c) 
{
	if(c=='('||c==')') 
		return true; 
	else 
		return false;
}

//获得符号的优先性
int getPri(char c) 
{
	switch(c) 
	{
	case '+':
	case '-':
		return 0;	//如果是加减,返回0
		break;
	case '*':
	case '/':
		return 1;	//如果是乘除,返回1
		break;
	case '(':
	case ')':
		return -1;  //注意,这里将括号设为最低优先级,因此括号不会被弹出,除非遇到右括号
		break;
	 }
}

//判断符号的优先性
void check(char c, stack<char>& coll2, deque<char>& coll3) 
{  
	if(coll2.empty()) 
	{
		coll2.push(c);
		return;
	}
 
	if(isPra(c)) 
	{
		if(c=='(') 
			coll2.push(c);
		else 
		{
			//弹出所有元素直到遇到左括号
			while(coll2.top()!='(') 
			{  
				char ch = coll2.top();
				coll3.push_back(ch);
				coll2.pop();
			}

			//当遇到左括号时,弹出但不加入coll3(后缀表达式中)
			coll2.pop();  
		}
	}
	else	//如果不是括号
	{
		//取出栈顶元素,与当前符号进行优先性比较
		char sym = coll2.top();  

		//比较两符号的优先性
		if(getPri(c)<=getPri(sym))  
		{
			//如果c的优先性比栈顶符号小或等于,弹出栈顶元素
			coll2.pop();
			//并将其压入coll3(后缀表达式)中
			coll3.push_back(sym);
			//递归调用check,比较当前符号c与下一个栈顶符号的优先性
			check(c,coll2,coll3);	
		}
		else 
		{
			//如果c比栈顶符号优先级大,那将c压入coll2(操作符栈)中
			coll2.push(c);  
		}
	}
}

//从coll中取出元素,分配元素到coll2和coll3中
void allocate(deque<char>& coll1, stack<char>& coll2, deque<char>& coll3) 
{  
	while(!coll1.empty()) 
	{
		char c = coll1.front();
		coll1.pop_front();

		if(c>='0'&&c<='9')
		{
			coll3.push_back(c);
		}
		else 
		{
			//调用check函数,针对不同情况作出不同操作
			check(c,coll2,coll3);  
		}

	}

	//如果输入结束,将coll2的元素全部弹出,加入后缀表达式中
	while(!coll2.empty()) 
	{  
		char c = coll2.top();
		coll3.push_back(c);
		coll2.pop();
	}
}

//计算后缀表达式
void calculate(deque<char>& coll3, stack<int>& coll4) 
{  
	while(!coll3.empty()) 
	{
		char c = coll3.front();
		coll3.pop_front();
		
		//如果是操作数,压入栈中
		if(c>='0'&&c<='9') 
		{
			//减去'0'得出偏移值,即为真实数值(如果直接转换成int,结果不对,因为char 转换为int是其编码值,例如'1'的编码值为49
			int op = c-'0';    
			coll4.push(op);     
		}
		else	 //如果是操作符,从栈中弹出元素进行计算
		{ 
			int op1 = coll4.top();
			coll4.pop();
			int op2 = coll4.top();
			coll4.pop();
			switch(c) 
			{
			case '+':
				coll4.push(op2+op1);
				break;
			case '-':
				coll4.push(op2-op1);
				break;
			case '*':
				coll4.push(op2*op1);
				break;
			case '/':
				coll4.push(op2/op1);  //注意是op2(op)op1而不是op1(op)op2
				break;
			}
		}
	}
}


int main()
{
	deque<char> coll1;  //盛放中缀表达式
	stack<char> coll2;  //盛放操作符
	deque<char> coll3;	//盛放后缀表达式
	stack<int>coll4;	//计算后缀表达式的辅助容器
	string str;
	cout<<"请输入表达式,按enter结束:"<<endl;
	cin>>str;
	for(int i=0;i!=str.size();++i) 
	{
		//逐一加入每个字符,这里使用deque因为deque在两端删除添加的速度最快
		coll1.push_back(str[i]);  
	}
 
	//从coll中取出元素,分配元素到coll2和coll3中
	allocate(coll1,coll2,coll3); 

	//计算后缀表达式
	calculate(coll3,coll4);  
	cout<<"计算结果为:"<<coll4.top()<<endl;
}



转载自: http://blog.csdn.net/mvpsendoh/article/details/6440835

  • 10
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
持多位数输入和小数计算。可以使用栈来实现括号和嵌套计算器。 以下是一个简单的示例代码: ```c++ #include <iostream> #include <stack> #include <string> using namespace std; // 判断字符是否为数字 bool isDigit(char c) { return c >= '0' && c <= '9'; } // 将字符串转化为数字 double strToDouble(string str) { double res = 0.0; double base = 1.0; bool flag = false; // 是否有小数点 int i = 0; if (str[i] == '-') { flag = true; ++i; } for (; i < str.size(); ++i) { if (str[i] == '.') { flag = true; continue; } if (flag) { base *= 0.1; res += (str[i] - '0') * base; } else { res = res * 10 + (str[i] - '0'); } } return flag ? (flag && str[0] == '-' ? -res : res) : (flag && str[0] == '-' ? -res : res); } // 计算两个数的运算结果 double calculate(double a, double b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } // 计算表达式的值 double evaluate(string expr) { stack<double> nums; stack<char> ops; for (int i = 0; i < expr.size(); ++i) { if (isDigit(expr[i])) { // 数字 int j = i; while (j < expr.size() && (isDigit(expr[j]) || expr[j] == '.')) { ++j; } double num = strToDouble(expr.substr(i, j - i)); nums.push(num); i = j - 1; } else if (expr[i] == '(') { // 左括号 ops.push(expr[i]); } else if (expr[i] == ')') { // 右括号 while (ops.top() != '(') { double b = nums.top(); nums.pop(); double a = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); nums.push(calculate(a, b, op)); } ops.pop(); } else if (expr[i] == '+' || expr[i] == '-') { // 加减 while (!ops.empty() && ops.top() != '(') { double b = nums.top(); nums.pop(); double a = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); nums.push(calculate(a, b, op)); } ops.push(expr[i]); } else if (expr[i] == '*' || expr[i] == '/') { // 乘除 while (!ops.empty() && (ops.top() == '*' || ops.top() == '/')) { double b = nums.top(); nums.pop(); double a = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); nums.push(calculate(a, b, op)); } ops.push(expr[i]); } } while (!ops.empty()) { double b = nums.top(); nums.pop(); double a = nums.top(); nums.pop(); char op = ops.top(); ops.pop(); nums.push(calculate(a, b, op)); } return nums.top(); } int main() { string expr; cout << "请输入表达式:" << endl; cin >> expr; double res = evaluate(expr); cout << "计算结果为:" << res << endl; return 0; } ``` 这个程序支持多位数输入和小数计算,可以通过栈来实现括号和嵌套计算器。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值