HCSDN

仅用于学习C++

codeup26854 中缀表达式的值

codeup26854  中缀表达式的值

时空限制    1000ms/128MB

题目描述

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

输入

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

输出

    中缀表达式的值。

样例输入

4+5-9+10*2@

样例输出

20


分析

字符串逐个字符扫描

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

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

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

当前字符是  运算符时

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


代码

#include<iostream>
#include<string>
#include<stack>
#include<cctype>
using namespace std;
string s;
stack<int> snum;
stack<char> ssym;

void calculate(){    //计算
	int x=snum.top(); snum.pop();	//数字栈弹出一个值
	int y=snum.top(); snum.pop();	//数字栈弹出一个值
	switch (ssym.top()){	//运算符栈弹出运算符
		case '+': y+=x; break;
		case '-': y-=x; break;
		case '*': y*=x; break;
		case '/': y/=x; break;
	}
	snum.push(y);	//运算后值入栈
	ssym.pop();		//运算符栈出栈
}

bool isbig(char ch){	//当前运算符s[i]  是否大于  运算符栈顶运算符
	if (ssym.empty()) return true;	//运算符栈空
	int now,sta;
	if (ch=='+' || ch=='-') now=1;	//当前运算符优先级,+-为1,*/为2
	else now=2;
	if (ssym.top()=='(') sta=0;		//运算符栈栈顶,(优先级0
	else if (ssym.top()=='+' || ssym.top()=='-') sta=1;
	else sta=2;
	return now>sta;
}

int main(){
	cin>>s;
	for (int i=0,len=s.size()-1; i<len; ){
		if (s[i]=='(') ssym.push(s[i]),i++;	//左括号直接入栈
		else if (s[i]==')'){	//右括号
			while (ssym.top()!='(') calculate();	//最近一次左括号后运算符符出栈
			ssym.pop();	//最近一次左括号出栈
			i++;	//跳过当前右括号
		}
		else if (isdigit(s[i])){	//数字,计算值
			int x=0;
			while (isdigit(s[i])) x=10*x+s[i++]-'0';
			snum.push(x);	//数字入栈
		}
		else {	//运算符
			while (!isbig(s[i])) calculate();	//当前运算符s[i]  <=  运算符栈顶运算符  运算符出栈
			ssym.push(s[i]);	//当前运算符入栈
			i++;
		}
	}
	while (!ssym.empty()) calculate();	//情况运算符栈
	cout<<snum.top()<<endl;
	return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载,不得用于商业用途。 https://blog.csdn.net/WDAJSNHC/article/details/79970028
个人分类:
上一篇codeup25997 字符串匹配问题
下一篇luogu1449 后缀表达式
想对作者说点什么? 我来说一句

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

关闭
关闭