codeup26854 中缀表达式的值

版权声明:本文为博主原创文章,未经博主允许不得转载,不得用于商业用途。 https://blog.csdn.net/WDAJSNHC/article/details/79970028

codeup26854  中缀表达式的值

时空限制    1000ms/128MB

题目描述

    模拟计算机处理算术表达式过程。从键盘上输入算术表达式串(只含+、-、×、÷运算符,允许含括号),输出算术表达式的值。设输入的表达式串是合法的,且只包含整数。

输入

    一行,中缀表达式,长度不超过255,以“@”结束。

输出

    中缀表达式的值。

样例输入

4+5-9+10*2@

样例输出

20

 

分析

字符串逐个字符扫描

当前字符是  左括号时,左括号直接入运算符栈

当前字符是  右括号时,运算符出栈,直到遇到左括号,每一个运算符出栈,都要从数字栈里出两个数字进行计算,计算结果压入数字栈

当前字符是  数字时,计算数值,值入数字栈

当前字符是  运算符时

            当前字符优先级 <= 运算符栈顶运算符优先级    运算符栈 出栈 计算,直到当前字符优先级 > 运算符栈顶运算符优先级,或运算符栈空,当前运算符入栈。

 

代码

#include<iostream>
#include<string>
#include<stack>
using namespace std;
string s;
stack<int> num;
stack<char> sym;

void calculate(){	//计算
	int x=num.top(); num.pop();
	int y=num.top(); num.pop();
	switch (sym.top()){
		case '+': y+=x; break;
		case '-': y-=x; break;
		case '*': y*=x; break;
		case '/': y/=x; break;
	}
	num.push(y);
	sym.pop();
}

int lev(char x){	//运算符分级
	if (x=='+' || x=='-') return 1;
	else if (x=='*' || x=='/') return 2;
	return 0;
}

int main(){
	cin>>s;
	for (int i=0,len=s.size()-1; i<len; ){
		if (s[i]=='(') sym.push(s[i]),i++;	//左括号直接入栈
		else if (s[i]==')'){	//右括号
			while (sym.top()!='(') calculate();	//运算符出栈 到 最近一次左括号
			sym.pop();	//最近一次左括号出栈
			i++;	//跳过当前右括号
		}
		else if (isdigit(s[i])){	//数字,计算值
			int x=0;
			while (isdigit(s[i])) x=10*x+s[i++]-'0';
			num.push(x);	//数字入栈
		}
		else {	//运算符
			while (!sym.empty() && lev(s[i])<=lev(sym.top())) calculate();
			//当前运算符s[i]  <=  运算符栈顶运算符  运算符出栈
			sym.push(s[i]);	//当前运算符入栈
			i++;
		}
	}
	while (!sym.empty()) calculate();	//清空运算符栈
	cout<<num.top()<<endl;
	return 0;
}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页