表达式计算

表达式计算  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
     解题思路:1.请先看 中缀表达式转换成后缀表达式过程,转换方法参考这里
         http://www.nowamagic.net/librarys/veda/detail/2307
          2.大概过程是建立两个全局栈Num,C分别压入表达式的数字与符号,当遇到压入符号优先级小于等于栈顶符号优先级时(优先级:"(">"*"="/">"+"="-">")"),即栈顶永远是优先级最大的,因为遇到优先级等于小于压入栈时,就会对两个栈取值进行计算(即数字栈取两个和字符栈取一个进行计算,得出结果压入数字栈),直到栈顶符号优先级更大或者栈被取完,然后存入该符号。当输入的字符串循环完后,检查数字栈的长度如果不唯一就对两个栈取值进行计算。(所有的运算遇到栈顶为"("就会终止。)


                            3.大佬的画图详细描述:http://blog.csdn.net/qq_36238595/article/details/54730341

代码如下:

#include <iostream> 
#include <math.h>
#include <string>
#include <vector>
#include <sstream>
#include <stack>
using namespace std;

stack<int> Num;//压入数 
stack<char> C;//压入字符 
string data;
bool js1(char a);
void js();
int js2(int a,int b,char c);

int main(){
	int i,j;
	getline(cin,data);
	js();
	cout<<Num.top()<<endl;
	return 0;
}
// 
void js(){
	int i = 0;
	while(i < data.size()){
		//如果为数字,则计算压入Num 
		if(data[i] >= '0' && data[i] <= '9'){
			int temp = data[i] - 48;
			while(i+1 < data.size() && data[i+1] >= '0' && data[i+1] <= '9'){
				temp *= 10;
				temp += data[i+1] - 48;
				i++;
			}
			Num.push(temp);
		}else if(data[i] == '('){//如果是(则直接压入C 
			C.push('(');
		}else{
			while(js1(data[i])){//判断是否进行计算 
				int temp1 = Num.top();Num.pop();
				int temp2 = Num.top();Num.pop();
				char temp3 = C.top(); C.pop();
				Num.push(js2(temp2,temp1,temp3));
			}
			if(data[i] != ')') 
			C.push(data[i]);
		}
		i++; 
	}
	while(Num.size() != 1){
		int temp1 = Num.top();Num.pop();
		int temp2 = Num.top();Num.pop();
		char temp3 = C.top(); C.pop();
		Num.push(js2(temp2,temp1,temp3));
	}
}
//传入参数,进行计算。 
int js2(int a,int b,char c){
	switch(c){
		case '*': return a * b;
		case '/': return a / b;
		case '-': return a - b;
		case '+': return a + b;
	}
}
//判断传入字符优先级是否高于栈顶字符,并如果栈为空返回false; 
bool js1(char a){
	if(C.size() == 0) return false; 
	if(a == ')'){
		switch(C.top()){
			case '(': C.pop();return false;
			default : return true;
		}
	}else if(a == '*' || a=='/'){
		switch(C.top()){
			case '(':return false;
			case '+':return false;
			case '-':return false;
			default	:return true;
		}
	}else{
		switch(C.top()){
			case '(':return false;
			default	:return true;
		}
	}
}

HTML 是一种用于创建网页的标记语言,它本身不支持表达式计算。但是,我们可以使用 JavaScript 来实现在 HTML 页面中进行表达式计算。JavaScript 是一种脚本语言,可以嵌入到 HTML 中,在浏览器端运行。 通过在 HTML 页面中嵌入 JavaScript 代码,我们可以实现简单的表达式计算。比如,我们可以在 HTML 页面中添加一个输入框和一个按钮,当用户输入一个表达式并点击按钮时,JavaScript 代码可以解析这个表达式计算出结果,最后将结果显示在页面上。 下面是一个简单的 HTML 页面示例,其中包含一个输入框和一个按钮,点击按钮时会计算输入框中的表达式并显示结果: ```html <!DOCTYPE html> <html> <head> <title>表达式计算</title> <script> function calculate() { // 获取输入框中的表达式 var expr = document.getElementById("expr").value; // 使用 eval 函数计算表达式的值 var result = eval(expr); // 将结果显示在页面上 document.getElementById("result").innerHTML = result; } </script> </head> <body> <h1>表达式计算</h1> <input type="text" id="expr" /> <button onclick="calculate()">计算</button> <div id="result"></div> </body> </html> ``` 请注意,eval 函数可以将字符串解析为 JavaScript 代码并执行。因此,在使用 eval 函数时应该非常小心,避免安全问题。同时,在实际开发中,我们也应该使用更加严谨和安全的方法来进行表达式计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值